package app

import (
	"context"
	"testing"
	"time"

	"github.com/stretchr/testify/require"

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

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

	ctx := context.Background()
	pool := startAppRollbackDB(t, ctx)
	now := time.Date(2026, 7, 29, 2, 30, 0, 0, time.UTC)
	fixture := seedAppAdminFixture(t, pool, "task_conversation_current_assignee", now)
	agentID := "agt_task_conversation_current_assignee"
	agentMemberID := "mem_task_conversation_current_assignee_agent"
	agentName := "current-task-assignee"
	seedAppPrivateAgentEntry(
		t,
		pool,
		fixture.WorkspaceID,
		fixture.UserID,
		fixture.MemberID,
		fixture.AllChannelID,
		"mac_task_conversation_current_assignee",
		agentID,
		agentMemberID,
		agentName,
		now,
	)
	taskScopeID := "tsk_task_conversation_current_assignee"
	seedTaskNotificationScope(t, pool, fixture, taskScopeID, agentMemberID, now)
	mustExec(t, pool, `
INSERT INTO im_conversation_index (
  workspace_id, member_id, conversation_id, scope_id, kind, sort_at,
  last_event_seq, projection_json, created_at, updated_at
) VALUES ($1, $2, $3, $4, 'task', $5, 1, $6, $5, $5)
`,
		fixture.WorkspaceID,
		fixture.MemberID,
		"task:"+taskScopeID,
		taskScopeID,
		now,
		`{
		  "id":"task:tsk_task_conversation_current_assignee",
		  "kind":"task",
		  "scopeId":"tsk_task_conversation_current_assignee",
		  "title":"#t1 Frozen task title",
		  "preview":"frozen preview",
		  "task":{
		    "id":"tsk_task_conversation_current_assignee",
		    "scopeId":"tsk_task_conversation_current_assignee",
		    "channelId":"placeholder",
		    "number":1,
		    "title":"Frozen task title",
		    "status":"todo",
		    "assigneeProfile":{
		      "actorType":"human",
		      "principalId":"usr_stale",
		      "memberId":"mem_stale",
		      "displayName":"Stale assignee"
		    }
		  }
		}`,
	)

	// Rolling Task writers mirror the canonical assignee into the legacy
	// responsibility columns until the later contract release flips readers.
	mustExec(t, pool, `
UPDATE tasks
SET assignee_member_id = $2,
    claimed_by_ref = $2,
    claimed_by_member_id = $2,
    current_agent_ref = $2,
    suggested_assignee_ref = '',
    reviewer_ref = '',
    updated_at = $3
WHERE id = $1
`, taskScopeID, agentMemberID, now.Add(time.Minute))

	conversationStore := message.New(pool, nil, 0, message.Options{})
	item, err := conversationStore.LoadConversationForUser(
		ctx,
		fixture.UserID,
		fixture.WorkspaceID,
		taskScopeID,
		false,
	)
	require.NoError(t, err)
	require.Equal(t, message.ConversationKindTask, item.Kind)
	require.Equal(t, "#t1 Task notification lifecycle", item.Title)
	require.Equal(t, "frozen preview", item.Preview)
	require.NotNil(t, item.Task)
	require.NotNil(t, item.Task.AssigneeProfile)
	require.Equal(t, message.AuthorActorTypeAgent, item.Task.AssigneeProfile.ActorType)
	require.Equal(t, agentID, item.Task.AssigneeProfile.PrincipalID)
	require.Equal(t, agentMemberID, item.Task.AssigneeProfile.MemberID)
	require.Equal(t, agentName, item.Task.AssigneeProfile.DisplayName)

	mustExec(t, pool, `
UPDATE tasks
SET assignee_member_id = NULL,
    claimed_by_ref = '',
    claimed_by_member_id = NULL,
    current_agent_ref = '',
    suggested_assignee_ref = '',
    reviewer_ref = '',
    updated_at = $2
WHERE id = $1
`, taskScopeID, now.Add(2*time.Minute))

	item, err = conversationStore.LoadConversationForUser(
		ctx,
		fixture.UserID,
		fixture.WorkspaceID,
		taskScopeID,
		false,
	)
	require.NoError(t, err)
	require.NotNil(t, item.Task)
	require.Nil(t, item.Task.AssigneeProfile, "unassignment must clear a stale projected assignee")
}
