package kb

import (
	"context"
	"testing"
	"time"

	"github.com/stretchr/testify/require"
)

func TestStoreLimitsDraftsToCollaboratorsUnlessDraftVisibilityBypassed(t *testing.T) {
	ctx := context.Background()
	store := newTestStore(t)
	now := time.Date(2026, 6, 1, 0, 0, 0, 0, time.UTC)
	for _, base := range []KnowledgeBase{
		{ID: "kb_official", WorkspaceID: "wsp_a", Name: "Official", DefaultWorkspaceMemberRole: "view", PublicationState: "official", IsActive: true, CreatedBy: "owner", UpdatedBy: "owner", CreatedAt: now, UpdatedAt: now},
		{ID: "kb_draft", WorkspaceID: "wsp_a", Name: "Draft", DefaultWorkspaceMemberRole: "view", PublicationState: "draft", IsActive: true, CreatedBy: "owner", UpdatedBy: "owner", CreatedAt: now, UpdatedAt: now.Add(time.Minute)},
		{ID: "kb_draft_member_managed", WorkspaceID: "wsp_a", Name: "Member managed draft", DefaultWorkspaceMemberRole: "manage", PublicationState: "draft", IsActive: true, CreatedBy: "owner", UpdatedBy: "owner", CreatedAt: now, UpdatedAt: now.Add(2 * time.Minute)},
		{ID: "kb_draft_member_edited", WorkspaceID: "wsp_a", Name: "Member edited draft", DefaultWorkspaceMemberRole: "view", PublicationState: "draft", IsActive: true, CreatedBy: "owner", UpdatedBy: "owner", CreatedAt: now, UpdatedAt: now.Add(3 * time.Minute)},
		{ID: "kb_draft_member_viewed", WorkspaceID: "wsp_a", Name: "Member viewed draft", DefaultWorkspaceMemberRole: "view", PublicationState: "draft", IsActive: true, CreatedBy: "owner", UpdatedBy: "owner", CreatedAt: now, UpdatedAt: now.Add(4 * time.Minute)},
		{ID: "kb_viewer_draft", WorkspaceID: "wsp_a", Name: "Viewer draft", DefaultWorkspaceMemberRole: "view", PublicationState: "draft", IsActive: true, CreatedBy: "viewer", UpdatedBy: "viewer", CreatedAt: now, UpdatedAt: now.Add(5 * time.Minute)},
		{ID: "kb_draft_legacy_owner_grant", WorkspaceID: "wsp_a", Name: "Legacy owner grant", DefaultWorkspaceMemberRole: "view", PublicationState: "draft", IsActive: true, CreatedBy: "", UpdatedBy: "owner", CreatedAt: now, UpdatedAt: now.Add(6 * time.Minute)},
	} {
		_, err := store.CreateKnowledgeBase(ctx, base)
		require.NoError(t, err)
	}
	_, err := store.UpsertKnowledgeBaseGrant(ctx, KnowledgeBaseGrant{ID: "grant_member_manage", WorkspaceID: "wsp_a", KnowledgeBaseID: "kb_draft_member_managed", SubjectType: "user", SubjectID: "viewer", Role: "manage", CreatedBy: "owner", UpdatedBy: "owner", CreatedAt: now, UpdatedAt: now})
	require.NoError(t, err)
	_, err = store.UpsertKnowledgeBaseGrant(ctx, KnowledgeBaseGrant{ID: "grant_member_edit", WorkspaceID: "wsp_a", KnowledgeBaseID: "kb_draft_member_edited", SubjectType: "user", SubjectID: "viewer", Role: "edit", CreatedBy: "owner", UpdatedBy: "owner", CreatedAt: now, UpdatedAt: now})
	require.NoError(t, err)
	_, err = store.UpsertKnowledgeBaseGrant(ctx, KnowledgeBaseGrant{ID: "grant_member_view", WorkspaceID: "wsp_a", KnowledgeBaseID: "kb_draft_member_viewed", SubjectType: "user", SubjectID: "viewer", Role: "view", CreatedBy: "owner", UpdatedBy: "owner", CreatedAt: now, UpdatedAt: now})
	require.NoError(t, err)
	_, err = store.UpsertKnowledgeBaseGrant(ctx, KnowledgeBaseGrant{ID: "grant_legacy_owner", WorkspaceID: "wsp_a", KnowledgeBaseID: "kb_draft_legacy_owner_grant", SubjectType: "user", SubjectID: "viewer", Role: "owner", CreatedBy: "owner", UpdatedBy: "owner", CreatedAt: now, UpdatedAt: now})
	require.NoError(t, err)

	viewer, err := store.ListKnowledgeBaseCollection(ctx, KnowledgeBaseCollectionOptions{WorkspaceID: "wsp_a", PrincipalID: "viewer", View: "all", Page: 1, PerPage: 10})
	require.NoError(t, err)
	require.ElementsMatch(t, []string{"kb_official", "kb_draft_member_managed", "kb_draft_member_edited", "kb_viewer_draft", "kb_draft_legacy_owner_grant"}, collectionKnowledgeBaseIDs(viewer))
	require.EqualValues(t, 5, viewer.Total)

	drafts, err := store.ListKnowledgeBaseCollection(ctx, KnowledgeBaseCollectionOptions{WorkspaceID: "wsp_a", PrincipalID: "viewer", View: "draft", Page: 1, PerPage: 10})
	require.NoError(t, err)
	require.ElementsMatch(t, []string{"kb_draft_member_managed", "kb_draft_member_edited", "kb_viewer_draft", "kb_draft_legacy_owner_grant"}, collectionKnowledgeBaseIDs(drafts))
	require.EqualValues(t, 4, drafts.Total)

	admin, err := store.ListKnowledgeBaseCollection(ctx, KnowledgeBaseCollectionOptions{WorkspaceID: "wsp_a", PrincipalID: "admin", BypassPrincipalAccessFilter: true, BypassDraftVisibilityFilter: true, View: "draft", Page: 1, PerPage: 10})
	require.NoError(t, err)
	require.ElementsMatch(t, []string{"kb_draft", "kb_draft_member_managed", "kb_draft_member_edited", "kb_draft_member_viewed", "kb_viewer_draft", "kb_draft_legacy_owner_grant"}, collectionKnowledgeBaseIDs(admin))
	require.EqualValues(t, 6, admin.Total)

	workspaceBypassOnly, err := store.ListKnowledgeBaseCollection(ctx, KnowledgeBaseCollectionOptions{WorkspaceID: "wsp_a", PrincipalID: "viewer", BypassPrincipalAccessFilter: true, View: "draft", Page: 1, PerPage: 10})
	require.NoError(t, err)
	require.ElementsMatch(t, []string{"kb_draft_member_managed", "kb_draft_member_edited", "kb_viewer_draft", "kb_draft_legacy_owner_grant"}, collectionKnowledgeBaseIDs(workspaceBypassOnly))
	require.EqualValues(t, 4, workspaceBypassOnly.Total)
}
