package kb

import (
	"context"
	"testing"

	"github.com/stretchr/testify/require"
	storekb "github.com/tidbcloud/AgentTeam/internal/store/kb"
)

func TestCreateKnowledgeBaseSetupPersistsDraftAndDerivesReadiness(t *testing.T) {
	svc := newKBServiceForTest(t)
	ctx := context.Background()
	base, setup, err := svc.CreateKnowledgeBaseSetup(ctx, "ws_1", "user_1", KBMutation{Name: "Draft KB"})
	require.NoError(t, err)
	require.Equal(t, KBPublicationDraft, base.PublicationState)
	require.NotEmpty(t, base.WorkingRevision)
	require.Empty(t, base.PublishedRevision)
	require.Equal(t, KBSetupModeCreateDraft, setup.Session.Mode)
	require.Equal(t, "ready", setup.StepSummary["basic"])
	require.Equal(t, "incomplete", setup.StepSummary["sources"])

	now := svc.now()
	_, err = svc.store.CreateSource(ctx, storekb.Source{
		ID: "src_1", WorkspaceID: base.WorkspaceID, KnowledgeBaseID: base.ID,
		SourceType: "codebase", Status: "ready", SyncStatus: "ready", Name: "agentteam",
		CreatedBy: "user_1", UpdatedBy: "user_1", CreatedAt: now, UpdatedAt: now,
	})
	require.NoError(t, err)

	setup, err = svc.SetKnowledgeBaseSetupSourceArtifact(ctx, "ws_1", "user_1", base.ID, "src_1", "wiki", "skipped")
	require.NoError(t, err)
	require.Equal(t, "ready", setup.StepSummary["sources"])
	require.Equal(t, "ready", setup.StepSummary["wiki"])
	require.Equal(t, "incomplete", setup.StepSummary["dashboard"])

	setup, err = svc.SetKnowledgeBaseSetupSourceArtifact(ctx, "ws_1", "user_1", base.ID, "src_1", "dashboard", "skipped")
	require.NoError(t, err)
	require.Equal(t, "ready", setup.StepSummary["dashboard"])
	require.Equal(t, "ready", setup.StepSummary["review"])

	updated, err := svc.UpdateKnowledgeBaseSetupStep(ctx, "ws_1", "user_1", base.ID, "review", setup.Session.Version)
	require.NoError(t, err)
	require.Equal(t, "review", updated.Session.ActiveStep)
	_, err = svc.UpdateKnowledgeBaseSetupStep(ctx, "ws_1", "user_1", base.ID, "basic", setup.Session.Version)
	require.ErrorIs(t, err, ErrConflict)
}

func TestCreateKnowledgeBaseSetupKeepsUntitledBasicStepIncomplete(t *testing.T) {
	svc := newKBServiceForTest(t)
	_, setup, err := svc.CreateKnowledgeBaseSetup(context.Background(), "ws_1", "user_1", KBMutation{})
	require.NoError(t, err)
	require.Equal(t, "incomplete", setup.StepSummary["basic"])
}

func TestKnowledgeBaseSetupHydratesDirectDashboardImportCapability(t *testing.T) {
	svc := newKBServiceForTest(t)
	svc.workspaceGovernanceAuthorizer = fakeWorkspaceGovernanceAuthorizer{authorize: func(_ context.Context, _, principalID string) (bool, error) {
		return principalID == "workspace-admin", nil
	}}
	base, _, err := svc.CreateKnowledgeBaseSetup(context.Background(), "ws_1", "workspace-admin", KBMutation{Name: "Draft KB"})
	require.NoError(t, err)

	setup, err := svc.GetKnowledgeBaseSetup(context.Background(), "ws_1", "workspace-admin", base.ID)
	require.NoError(t, err)
	require.True(t, setup.CanDirectDashboardImport)

	now := svc.now()
	_, err = svc.store.UpsertKnowledgeBaseGrant(context.Background(), storekb.KnowledgeBaseGrant{
		ID: "grant_editor", WorkspaceID: "ws_1", KnowledgeBaseID: base.ID,
		SubjectType: "user", SubjectID: "editor-member", Role: "edit",
		CreatedBy: "workspace-admin", UpdatedBy: "workspace-admin", CreatedAt: now, UpdatedAt: now,
	})
	require.NoError(t, err)
	setup, err = svc.GetKnowledgeBaseSetup(context.Background(), "ws_1", "editor-member", base.ID)
	require.NoError(t, err)
	require.False(t, setup.CanDirectDashboardImport)
}

func TestKnowledgeBaseCollectionFiltersPublicationBeforePagination(t *testing.T) {
	svc := newKBServiceForTest(t)
	ctx := context.Background()
	draft, _, err := svc.CreateKnowledgeBaseSetup(ctx, "ws_1", "user_1", KBMutation{Name: "Draft KB"})
	require.NoError(t, err)
	official, err := svc.CreateKnowledgeBase(ctx, "ws_1", "user_1", KBMutation{Name: "Official KB"})
	require.NoError(t, err)

	drafts, err := svc.ListKnowledgeBases(ctx, "ws_1", "user_1", KBPublicationDraft, "", nil, 1, 1)
	require.NoError(t, err)
	require.EqualValues(t, 1, drafts.Total)
	require.Equal(t, draft.ID, drafts.Items[0].ID)
	require.NotNil(t, drafts.Items[0].SetupSummary)
	require.Equal(t, "basic", drafts.Items[0].SetupSummary.ActiveStep)
	officials, err := svc.ListKnowledgeBases(ctx, "ws_1", "user_1", KBPublicationOfficial, "", nil, 1, 1)
	require.NoError(t, err)
	require.EqualValues(t, 1, officials.Total)
	require.Equal(t, official.ID, officials.Items[0].ID)
	require.Nil(t, officials.Items[0].SetupSummary)
}
