package converter

import (
	"strings"

	"github.com/tidbcloud/AgentTeam/internal/api/dto"
	"github.com/tidbcloud/AgentTeam/internal/schedule/manage"
	"github.com/tidbcloud/AgentTeam/internal/store/message"
	"github.com/tidbcloud/AgentTeam/internal/trigger"
)

// FromScheduleMutationRequest maps the browser wire request to scheduler input.
func FromScheduleMutationRequest(request dto.ScheduleMutationRequest) manage.UpsertInput {
	return manage.UpsertInput{
		Name:                  request.Name,
		Source:                request.Source,
		Target:                request.Target,
		MessageTemplate:       request.MessageTemplate,
		MentionHints:          FromScheduleMentionHints(request.Mentions),
		MentionHintsSet:       request.Mentions != nil,
		AlsoStartThread:       request.AlsoStartThread,
		HumanNotificationMode: request.HumanNotificationMode,
	}
}

// FromTriggerMutationRequest maps the browser wire request to trigger input.
func FromTriggerMutationRequest(request dto.TriggerMutationRequest) trigger.UpsertInput {
	return trigger.UpsertInput{
		Name:                  request.Name,
		Source:                request.Source,
		Target:                request.Target,
		MessageTemplate:       request.MessageTemplate,
		MentionHints:          FromScheduleMentionHints(request.Mentions),
		MentionHintsSet:       request.Mentions != nil,
		HumanNotificationMode: request.HumanNotificationMode,
	}
}

// FromScheduleMentionHints maps schedule wire hints to persistence hints.
func FromScheduleMentionHints(mentions []dto.MessageMentionHint) []message.MessageMentionHint {
	if len(mentions) == 0 {
		return nil
	}
	out := make([]message.MessageMentionHint, 0, min(len(mentions), message.MaxPersistedMentionHints))
	for _, mention := range mentions {
		mentionType := strings.TrimSpace(mention.Type)
		id := strings.TrimSpace(mention.ID)
		token := strings.TrimSpace(mention.Token)
		if mentionType == "" || id == "" || token == "" {
			continue
		}
		out = append(out, message.MessageMentionHint{
			Type:     mentionType,
			ID:       id,
			Token:    token,
			Metadata: mention.Metadata,
		})
		if len(out) >= message.MaxPersistedMentionHints {
			break
		}
	}
	return out
}
