package converter

import (
	"fmt"
	"testing"

	"github.com/stretchr/testify/require"

	"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"
)

func TestFromScheduleMentionHintsPreservesNormalizationAndLimit(t *testing.T) {
	t.Parallel()

	mentions := []dto.MessageMentionHint{
		{Type: " ", ID: "agt_invalid", Token: "@invalid"},
		{Type: " agent ", ID: " agt_0 ", Token: " @helper ", Metadata: map[string]any{"source": "picker"}},
	}
	for i := 1; i < message.MaxPersistedMentionHints+4; i++ {
		mentions = append(mentions, dto.MessageMentionHint{
			Type:  "agent",
			ID:    fmt.Sprintf("agt_%d", i),
			Token: fmt.Sprintf("@helper%d", i),
		})
	}

	hints := FromScheduleMentionHints(mentions)

	require.Len(t, hints, message.MaxPersistedMentionHints)
	require.Equal(t, message.MessageMentionHint{
		Type:     "agent",
		ID:       "agt_0",
		Token:    "@helper",
		Metadata: map[string]any{"source": "picker"},
	}, hints[0])
	require.Equal(t, "agt_31", hints[message.MaxPersistedMentionHints-1].ID)
}

func TestFromScheduleMutationRequestPreservesMentionPresence(t *testing.T) {
	t.Parallel()

	nilInput := FromScheduleMutationRequest(dto.ScheduleMutationRequest{Mentions: nil})
	require.False(t, nilInput.MentionHintsSet)
	require.Nil(t, nilInput.MentionHints)

	emptyInput := FromScheduleMutationRequest(dto.ScheduleMutationRequest{Mentions: []dto.MessageMentionHint{}})
	require.True(t, emptyInput.MentionHintsSet)
	require.Nil(t, emptyInput.MentionHints)
}

func TestFromScheduleMutationRequestPreservesFields(t *testing.T) {
	t.Parallel()

	request := dto.ScheduleMutationRequest{
		Name:                  "daily",
		Source:                manage.SourceInput{SourceKind: manage.SourceKindTime},
		Target:                manage.TargetInput{Ref: "chn_1"},
		MessageTemplate:       "hello @helper",
		Mentions:              []dto.MessageMentionHint{{Type: "agent", ID: "agt_1", Token: "@helper"}},
		AlsoStartThread:       true,
		HumanNotificationMode: manage.HumanNotificationModeNone,
	}

	input := FromScheduleMutationRequest(request)

	require.Equal(t, request.Name, input.Name)
	require.Equal(t, request.Source, input.Source)
	require.Equal(t, request.Target, input.Target)
	require.Equal(t, request.MessageTemplate, input.MessageTemplate)
	require.Equal(t, request.AlsoStartThread, input.AlsoStartThread)
	require.Equal(t, request.HumanNotificationMode, input.HumanNotificationMode)
	require.True(t, input.MentionHintsSet)
	require.Equal(t, []message.MessageMentionHint{{Type: "agent", ID: "agt_1", Token: "@helper"}}, input.MentionHints)
}

func TestFromTriggerMutationRequestPreservesFieldsAndMentionPresence(t *testing.T) {
	t.Parallel()

	request := dto.TriggerMutationRequest{
		Name:                  "watch",
		Source:                trigger.SourceInput{SourceKind: trigger.SourceKindEvent},
		Target:                trigger.TargetInput{Ref: "chn_1"},
		MessageTemplate:       "hello @helper",
		Mentions:              []dto.MessageMentionHint{},
		HumanNotificationMode: trigger.HumanNotificationModeNone,
	}

	input := FromTriggerMutationRequest(request)

	require.Equal(t, request.Name, input.Name)
	require.Equal(t, request.Source, input.Source)
	require.Equal(t, request.Target, input.Target)
	require.Equal(t, request.MessageTemplate, input.MessageTemplate)
	require.Equal(t, request.HumanNotificationMode, input.HumanNotificationMode)
	require.True(t, input.MentionHintsSet)
	require.Nil(t, input.MentionHints)
}
