package converter

import (
	"testing"
	"time"

	"github.com/stretchr/testify/require"

	"github.com/tidbcloud/AgentTeam/internal/store/message"
)

func TestToReviewFeedbackMessageConvertsMetadataPayload(t *testing.T) {
	createdAt := time.Date(2026, 7, 1, 10, 0, 0, 0, time.UTC)
	payload, err := message.BuildReviewFeedbackPayload(message.ReviewFeedbackBuildRequest{
		Context: message.ReviewFeedbackContextSnapshot{
			ReviewContextID: "rctx_1",
			SourceAgentID:   "agt_source",
		},
		Decision: message.ReviewFeedbackDecisionApproved,
		Refs:     map[string]any{"headRef": "feature"},
		Items: []message.ReviewFeedbackItemInput{{
			ID:                "item_1",
			Type:              "line",
			Path:              "new.go",
			OldPath:           "old.go",
			Side:              "new",
			OldLine:           converterInt64Ptr(9),
			NewLine:           converterInt64Ptr(12),
			StartLine:         converterInt64Ptr(12),
			EndLine:           converterInt64Ptr(14),
			HunkHeader:        "@@ -9 +12 @@",
			AnchorFingerprint: "fp",
			CodePreview:       "if err != nil {\nreturn err\n}",
			Body:              "fix this",
		}},
		SubmittedByMemberID: "mem_author",
		SubmittedAt:         createdAt,
	})
	require.NoError(t, err)
	metadata, err := message.BuildReviewFeedbackMetadata(payload)
	require.NoError(t, err)

	got := ToReviewFeedbackMessage(message.AppMessage{
		ID:        "msg_1",
		Content:   "Review feedback",
		Metadata:  metadata,
		CreatedAt: createdAt,
		AuthorProfile: message.AuthorProfile{
			ActorType:   message.AuthorActorTypeHuman,
			MemberID:    "mem_author",
			DisplayName: "Reviewer",
		},
	})

	require.Equal(t, "msg_1", got.ID)
	require.Equal(t, "rctx_1", got.ReviewContextID)
	require.Equal(t, "agt_source", got.SourceAgentID)
	require.Equal(t, message.ReviewFeedbackStatusOpen, got.Status)
	require.Equal(t, message.ReviewFeedbackDecisionApproved, got.Decision)
	require.Len(t, got.Items, 1)
	item := got.Items[0]
	require.Equal(t, "item_1", item.ID)
	require.Equal(t, "msg_1", item.FeedbackMessageID)
	require.Equal(t, "line", item.Type)
	require.Equal(t, "new.go", item.Path)
	require.Equal(t, "old.go", item.OldPath)
	require.Equal(t, "new", item.Side)
	require.Equal(t, int64(9), *item.OldLine)
	require.Equal(t, int64(12), *item.NewLine)
	require.Equal(t, int64(12), *item.StartLine)
	require.Equal(t, int64(14), *item.EndLine)
	require.Equal(t, "@@ -9 +12 @@", item.HunkHeader)
	require.Equal(t, "fp", item.AnchorFingerprint)
	require.Equal(t, "if err != nil {\nreturn err\n}", item.CodePreview)
	require.Equal(t, "Reviewer", item.AuthorDisplayName)
}

func converterInt64Ptr(value int64) *int64 {
	return &value
}
