package knowledgeqa

import (
	"encoding/json"
	"strings"
	"testing"

	"github.com/stretchr/testify/require"

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

func TestTurnProjectionExposesOnlyExplicitDebugModelOutput(t *testing.T) {
	debugModelOutput := `{"model_output":"` + strings.Repeat("full-debug-output-", 5000) + `"}`
	require.Greater(t, len(debugModelOutput), 64<<10)
	debugTurn := turnFromStore(knowledgeqastore.Turn{
		ID: "kqt_debug", Status: "failed", ErrorDetail: "internal error detail",
		DebugModelOutput: debugModelOutput,
	})
	require.Equal(t, debugModelOutput, toTurnDTO(debugTurn).DebugModelOutput)
	require.NotContains(t, toTurnDTO(debugTurn).DebugModelOutput, "debug output truncated")

	ordinaryTurn := turnFromStore(knowledgeqastore.Turn{
		ID: "kqt_internal", Status: "failed", ErrorDetail: "database connection failed",
	})
	require.Empty(t, toTurnDTO(ordinaryTurn).DebugModelOutput)

	completedTurn := turnFromStore(knowledgeqastore.Turn{
		ID: "kqt_completed", Status: "completed", DebugModelOutput: debugModelOutput,
	})
	require.Empty(t, toTurnDTO(completedTurn).DebugModelOutput)
}

func TestTurnProjectionPreservesStructuredActivitiesWithoutLeakingAttemptID(t *testing.T) {
	authorizedKBs := 2
	missingSources := 0
	projected := toTurnDTO(turnFromStore(knowledgeqastore.Turn{
		ID:               "kqt_structured",
		SessionID:        "kqs_1",
		CurrentAttemptID: "kqa_secret",
		Status:           "failed",
		Activities: []protocol.RuntimeActivity{{
			ID:       "tool:1",
			Sequence: 1,
			Kind:     "tool",
			Status:   "completed",
			ToolName: "scope_check",
			Stage:    "scope_authorized",
			Counts: &protocol.RuntimeActivityCounts{
				AuthorizedKnowledgeBases: &authorizedKBs,
				MissingSources:           &missingSources,
			},
		}},
	}))

	require.Len(t, projected.Activities, 1)
	require.Equal(t, "scope_authorized", projected.Activities[0].Stage)
	require.Equal(t, 2, *projected.Activities[0].Counts.AuthorizedKnowledgeBases)
	require.Equal(t, 0, *projected.Activities[0].Counts.MissingSources)

	encoded, err := json.Marshal(projected)
	require.NoError(t, err)
	require.Contains(t, string(encoded), "\"stage\":\"scope_authorized\"")
	require.Contains(t, string(encoded), "\"authorizedKnowledgeBases\":2")
	require.Contains(t, string(encoded), "\"missingSources\":0")
	require.NotContains(t, string(encoded), "currentAttemptId")
	require.NotContains(t, string(encoded), "kqa_secret")
}
