package server

import (
	"context"
	"log/slog"
	"strings"
	"time"

	"github.com/tidbcloud/AgentTeam/internal/knowledgeqa/protocol"
	"github.com/tidbcloud/AgentTeam/internal/store/im"
)

const knowledgeQATurnEventWriteTimeout = 5 * time.Second

type knowledgeQATurnEventWriter interface {
	AppendMemberWorkspaceEvent(context.Context, string, string, im.StreamEvent) (im.StreamEvent, error)
}

type knowledgeQATurnStreamNotifier struct {
	writer knowledgeQATurnEventWriter
	logger *slog.Logger
}

func newKnowledgeQATurnStreamNotifier(writer knowledgeQATurnEventWriter, logger *slog.Logger) *knowledgeQATurnStreamNotifier {
	if writer == nil {
		return nil
	}
	if logger == nil {
		logger = slog.Default()
	}
	return &knowledgeQATurnStreamNotifier{writer: writer, logger: logger}
}

func (notifier *knowledgeQATurnStreamNotifier) NotifyKnowledgeQATurnUpdated(ctx context.Context, update protocol.TurnUpdate) {
	if notifier == nil || notifier.writer == nil {
		return
	}
	workspaceID := strings.TrimSpace(update.WorkspaceID)
	memberID := strings.TrimSpace(update.OwnerMemberID)
	threadChannelID := strings.TrimSpace(update.ThreadChannelID)
	turnID := strings.TrimSpace(update.TurnID)
	if workspaceID == "" || memberID == "" || threadChannelID == "" || turnID == "" {
		return
	}
	writeCtx, cancel := context.WithTimeout(ctx, knowledgeQATurnEventWriteTimeout)
	defer cancel()
	_, err := notifier.writer.AppendMemberWorkspaceEvent(
		writeCtx,
		workspaceID,
		memberID,
		im.StreamEvent{
			Type:     protocol.TurnUpdatedEventType,
			ScopeID:  threadChannelID,
			EntityID: turnID,
			Payload: map[string]any{
				"threadChannelId":          threadChannelID,
				"turnId":                   turnID,
				"messageProjectionChanged": update.MessageProjectionChanged,
			},
		},
	)
	if err != nil {
		notifier.logger.Warn("publish Knowledge Q&A turn update", "error", err)
	}
}
