package approvalapp

import (
	"encoding/json"
	"testing"

	"github.com/stretchr/testify/require"
	"github.com/tidbcloud/AgentTeam/internal/kbgovernance"
)

func TestWikiGenerationTerminalCardsDistinguishJobOutcome(t *testing.T) {
	for _, test := range []struct {
		name      string
		terminal  kbgovernance.WikiGenerationTerminal
		titleKey  string
		fieldName string
	}{
		{
			name:     "ready",
			terminal: wikiGenerationTerminalFixture(kbgovernance.WikiGenerationTerminalReady, "", "wiki-sha"),
			titleKey: "kb_wiki_generation_ready", fieldName: "artifact_revision",
		},
		{
			name:     "failed",
			terminal: wikiGenerationTerminalFixture(kbgovernance.WikiGenerationTerminalFailed, "generation_failed", ""),
			titleKey: "kb_wiki_generation_failed", fieldName: "reason",
		},
		{
			name:     "stale",
			terminal: wikiGenerationTerminalFixture(kbgovernance.WikiGenerationTerminalStale, "source_revision_changed", ""),
			titleKey: "kb_wiki_generation_stale", fieldName: "reason",
		},
	} {
		t.Run(test.name, func(t *testing.T) {
			require.NoError(t, validateWikiGenerationTerminal(test.terminal, kbgovernance.NotifyWikiGenerationTerminalCommand{
				WorkspaceID: "ws_1", RequestID: "kbgr_1", ExpectedVersion: 3,
			}))
			content, err := wikiGenerationTerminalContent(test.terminal)
			require.NoError(t, err)
			var card struct {
				Template string `json:"template"`
				TitleKey string `json:"titleKey"`
				Actions  []struct {
					Type string `json:"type"`
					URL  string `json:"url"`
				} `json:"actions"`
				Fields []struct {
					Label string `json:"label"`
					Value string `json:"value"`
				} `json:"fields"`
			}
			require.NoError(t, json.Unmarshal(content.CardJSON, &card))
			require.Equal(t, "default", card.Template)
			require.Equal(t, test.titleKey, card.TitleKey)
			require.Equal(t, "open_url", card.Actions[0].Type)
			require.Equal(t, "/kb/kb_1?setup=wiki&source=src_1", card.Actions[0].URL)
			require.Equal(t, test.fieldName, card.Fields[len(card.Fields)-1].Label)
			require.NotContains(t, string(content.CardJSON), "private/path")
		})
	}
}

func TestWikiGenerationTerminalRejectsRawFailureDetails(t *testing.T) {
	terminal := wikiGenerationTerminalFixture(kbgovernance.WikiGenerationTerminalFailed, "/private/path token=secret", "")
	require.Error(t, validateWikiGenerationTerminal(terminal, kbgovernance.NotifyWikiGenerationTerminalCommand{
		WorkspaceID: "ws_1", RequestID: "kbgr_1", ExpectedVersion: 3,
	}))
}

func TestWikiGenerationTerminalRecipientPolicyAllowsExactRequester(t *testing.T) {
	document, _, err := recipientPolicyDocument(2)
	require.NoError(t, err)
	var policy struct {
		BasisKinds          []string `json:"allowed_recipient_basis_kinds"`
		BusinessObjectTypes []string `json:"allowed_business_object_types"`
	}
	require.NoError(t, json.Unmarshal(document, &policy))
	require.Contains(t, policy.BasisKinds, RecipientBasisWikiGenerationRequester)
	require.Contains(t, policy.BusinessObjectTypes, BusinessTypeWikiGenerationRequest)
}

func wikiGenerationTerminalFixture(status, reason, artifact string) kbgovernance.WikiGenerationTerminal {
	return kbgovernance.WikiGenerationTerminal{
		WorkspaceID: "ws_1", KnowledgeBaseID: "kb_1", SourceID: "src_1",
		SourceRevision: "rev_1", RequestID: "kbgr_1", RequesterID: "usr_1",
		Status: status, Reason: reason, ArtifactRevision: artifact, Version: 3,
	}
}
