package message

import (
	"context"
	"testing"
	"time"

	"github.com/stretchr/testify/require"
)

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

	queryer := &fakeContributionSourceQueryer{}

	sources, err := NewContributionSourceResolver(queryer).ResolveForMessages(context.Background(), " wsp_1 ", []string{" msg_1 ", "msg_1", ""})

	require.NoError(t, err)
	require.Empty(t, sources)
	require.Equal(t, []any{"wsp_1", "msg_1"}, queryer.args)
	require.True(t, queryer.nativeRows.closed)
	require.True(t, queryer.workflowRows.closed)
	require.True(t, queryer.scheduleRows.closed)
}

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

	resolved := ResolveContributionSource(" msg_1 ", ContributionSourceForServiceEventDelivery(ServiceEventDeliveryContributionSourceParams{
		DeliveryID:  "sed_1",
		Label:       "Gitea PR",
		EventID:     "evt_1",
		EventAction: "pull_request.merged",
	}))

	require.Equal(t, "msg_1", resolved.MessageID)
	require.Equal(t, ContributionSourceResolutionNativeLedger, resolved.ResolutionKind)
	require.Equal(t, ContributionSourceRefTypeServiceEventDelivery, resolved.Source.RefType)
	require.Equal(t, "sed_1", resolved.Presentation.RefID)
	require.Equal(t, "provider_event", resolved.Presentation.Kind)
	require.Equal(t, "native_ledger", resolved.Presentation.ResolutionKind)
	require.Equal(t, "Gitea PR", resolved.Presentation.Label)
}

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

	resolved := ResolveContributionSource("msg_human", ContributionSource{
		Kind:    ContributionSourceKindHumanCompose,
		RefType: ContributionSourceRefTypeMessage,
		RefID:   "msg_human",
		Label:   "Alice",
	})

	require.Equal(t, ContributionSourceResolutionAuthor, resolved.ResolutionKind)
	require.Equal(t, "author_source", resolved.Presentation.ResolutionKind)
	require.Equal(t, ContributionSourceKindHumanCompose, resolved.Presentation.Kind)
	require.Equal(t, "Alice", resolved.Presentation.Label)
}

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

	payload, err := BuildReviewFeedbackPayload(ReviewFeedbackBuildRequest{
		Context:             ReviewFeedbackContextSnapshot{ReviewContextID: "rctx_source", DisplayName: "Backend diff"},
		ClientMessageID:     "client-review-source",
		SubmittedByMemberID: "mem_reviewer",
		SubmittedAt:         time.Date(2026, 7, 2, 1, 2, 3, 0, time.UTC),
		Items:               []ReviewFeedbackItemInput{{ID: "item_source", Body: "please fix"}},
	})
	require.NoError(t, err)
	metadata, err := BuildReviewFeedbackMetadata(payload)
	require.NoError(t, err)

	messages := []AppMessage{{
		ID: "msg_review_source",
		AuthorProfile: AuthorProfile{
			ActorType:   AuthorActorTypeHuman,
			DisplayName: "Reviewer",
		},
		Metadata: metadata,
	}}
	err = NewContributionSourceResolver(nil).AttachToAppMessages(context.Background(), "wsp_source", messages)
	require.NoError(t, err)
	require.Equal(t, ContributionSourceKindReviewComment, messages[0].Source.Kind)
	require.Equal(t, ContributionSourceRefTypeMessage, messages[0].Source.RefType)
	require.Equal(t, "msg_review_source", messages[0].Source.RefID)
	require.Equal(t, "Backend diff", messages[0].Source.Label)
}
