package knowledgeqa

import (
	"context"
	"crypto/ed25519"
	"strings"
	"testing"
	"time"

	"github.com/stretchr/testify/require"

	"github.com/tidbcloud/AgentTeam/internal/forwarder"
	"github.com/tidbcloud/AgentTeam/internal/knowledgeqa/protocol"
	"github.com/tidbcloud/AgentTeam/internal/maas/capability"
	knowledgeqastore "github.com/tidbcloud/AgentTeam/internal/store/knowledgeqa"
)

func TestWorkerAlwaysLoadsSameSessionRuntimeContextAsNonEvidence(t *testing.T) {
	now := time.Date(2026, 7, 25, 8, 0, 0, 0, time.UTC)
	_, privateKey, err := ed25519.GenerateKey(nil)
	require.NoError(t, err)
	store := &workerTestStore{
		turn: knowledgeqastore.Turn{
			ID: "kqt_2", WorkspaceID: "wsp_1", OrganizationID: "org_1", SessionID: "kqs_1",
			RequesterUserID: "usr_1", Question: "How does rollout work?", CurrentAttemptID: "kqa_2",
		},
		session: knowledgeqastore.Session{ID: "kqs_1", OwnerMemberID: "mem_1"},
		runtimeContext: knowledgeqastore.RuntimeContext{
			Generation:             2,
			Summary:                "Earlier [E1](agentteam-kqa-citation://kqs_1/kqc_1234567890abcd) discussion.",
			CompactedThroughTurnID: "kqt_0", SummaryVersion: "knowledge-qa-context-v1",
			Turns: []knowledgeqastore.RuntimeHistoryTurn{{
				TurnID: "kqt_1", Status: "completed", Question: "What changed?",
				Answer: "Two policy points [E2](agentteam-kqa-citation://kqs_1/kqc_abcdefghijklmn)(agentteam-kqa-citation://kqs_model/kqc_deadbeef).",
			}},
			Bytes: 32,
		},
	}
	runtime := &workerTestRuntime{
		prepared: forwarder.KnowledgeQARuntimePrepareResult{
			Roots: []forwarder.KnowledgeQARuntimeRoot{{
				HandleID: "kqh_2", KnowledgeBaseID: "kb_1", SourceID: "src_1",
				RootKind: "primary", RepoRole: "primary", Revision: "sha-fixed",
			}},
			RuntimeVersion: "knowledge-qa-v3", PromptVersion: "exploration-v2",
		},
		result: forwarder.KnowledgeQARuntimeResult{
			Status: "no_answer", RuntimeVersion: "knowledge-qa-v3", PromptVersion: "exploration-v2",
			RuntimeContext: &forwarder.KnowledgeQARuntimeContextUpdate{
				ExpectedGeneration: 2, Summary: "Earlier rollout discussion.",
				CompactedThroughTurnID: "kqt_1", SummaryVersion: "knowledge-qa-context-v1", CompactedTurnCount: 1,
			},
		},
	}
	worker, err := NewWorker(WorkerOptions{
		Store: store, Policies: workerTestPolicy{effective: protocol.EffectivePolicy{
			Model: "model-a", ReasonLevel: "high", WorkloadKind: capability.WorkloadKnowledgeQA, OrganizationPolicyVersion: 1,
		}}, Runtime: runtime, Signer: capability.Signer{KeyID: "test", PrivateKey: privateKey},
		Provisioner: workerTestProvisioner{}, Messages: workerTestMessages{}, MessageFanout: &workerTestMessageFanout{}, Now: func() time.Time { return now },
	})
	require.NoError(t, err)
	worker.execute(context.Background(), knowledgeqastore.QueuedAttempt{WorkspaceID: "wsp_1", TurnID: "kqt_2", AttemptID: "kqa_2"})
	require.Len(t, runtime.request.RuntimeContext.Turns, 1)
	require.False(t, runtime.request.RuntimeContext.Turns[0].Evidence)
	require.Equal(t, "conversation_history", runtime.request.RuntimeContext.Turns[0].Provenance)
	require.Equal(t, "Earlier [E1] discussion.", runtime.request.RuntimeContext.Summary)
	require.Equal(t, "Two policy points [E2].", runtime.request.RuntimeContext.Turns[0].Answer)
	require.NotNil(t, store.completion.RuntimeContext)
	require.Equal(t, int64(2), store.completion.RuntimeContext.ExpectedGeneration)
	require.Equal(t, "kqt_1", store.completion.RuntimeContext.CompactedThroughTurnID)
	historyEvent := -1
	for index, event := range store.events {
		if strings.Contains(event.Summary, "conversation context") {
			historyEvent = index
		}
	}
	require.GreaterOrEqual(t, historyEvent, 0)
	require.Equal(t, []string{"preparing->generating"}, store.transitions)
	require.Condition(t, func() bool {
		for _, event := range store.events {
			if strings.Contains(event.Summary, "conversation context") {
				return true
			}
		}
		return false
	})
}
