package converter

import (
	"encoding/json"
	"testing"
	"time"

	"github.com/stretchr/testify/require"

	"github.com/tidbcloud/AgentTeam/internal/service/skills"
	store "github.com/tidbcloud/AgentTeam/internal/store/resource/skills"
)

func TestToSkillMarksEveryRegisteredOfficialLibrary(t *testing.T) {
	for _, slug := range []string{
		"agentteam-workflow-plan-author-skills",
		"superpowers",
		"addy-agent-skills",
	} {
		converted := ToSkill(store.Skill{Slug: slug, CreatedBy: "agentteam-system"})
		require.True(t, converted.IsOfficial, slug)
	}

	converted := ToSkill(store.Skill{
		Slug:      "agentteam-workflow-plan-author-skills",
		CreatedBy: "usr_1",
	})
	require.False(t, converted.IsOfficial)
}

func TestToSkillRepositorySkillsResponseKeepsScanDiagnostics(t *testing.T) {
	response := ToSkillRepositorySkillsResponse(skills.SkillRepositoryScanData{
		CommitSHA: "abc123",
		Limit:     200,
		DetectedSkills: []skills.SkillRepositoryDetectedSkill{
			{
				Name:        "backend-sk",
				Description: "Backend helper",
				Path:        "skills/backend/SKILL.md",
				Layout:      skills.SkillRepositoryLayoutTemplate,
				Status:      skills.SkillRepositorySkillStatusValid,
				IssueCode:   skills.SkillRepositoryIssueOK,
			},
			{
				Name:      "missing-description",
				Path:      "skills/missing-description/SKILL.md",
				Layout:    skills.SkillRepositoryLayoutTemplate,
				Status:    skills.SkillRepositorySkillStatusRejected,
				IssueCode: skills.SkillRepositoryIssueMissingDescription,
			},
		},
	})

	require.Equal(t, 2, response.Total)
	require.Len(t, response.Items, 2)
	require.Equal(t, "abc123", response.CommitSHA)
	require.Equal(t, skills.SkillRepositorySkillStatusValid, response.Items[0].Status)
	require.Equal(t, skills.SkillRepositoryIssueMissingDescription, response.Items[1].IssueCode)
}

func TestNativeAgentSkillAccessUsesExactContentReferencesWithoutAGSIdentity(t *testing.T) {
	now := time.Date(2026, 8, 20, 12, 0, 0, 0, time.UTC)
	response := ToAgentSkillAccessBatchResponse(skills.AgentSkillAccessBatch{Agents: map[string][]skills.AgentAccessibleSkill{
		"agt_1": {{
			ID: "skill_1", WorkspaceID: "wsp_1", Name: "Reviewer",
			ContentID: "ctn_1", ContentVersionID: "cvn_1", PermissionSetAt: now, UpdatedAt: now,
		}},
	}})
	require.Equal(t, "ctn_1", response.Agents["agt_1"][0].ContentID)
	require.Equal(t, "cvn_1", response.Agents["agt_1"][0].ContentVersionID)
	require.Nil(t, response.Agents["agt_1"][0].Repository)
	require.Empty(t, response.Agents["agt_1"][0].Branch)

	payload, err := json.Marshal(response.Agents["agt_1"][0])
	require.NoError(t, err)
	require.NotContains(t, string(payload), "repository")
	require.NotContains(t, string(payload), "branch")
}

func TestNativeSkillContentsOmitLegacyCommitReference(t *testing.T) {
	response := ToSkillRepositoryContentsResponse(skills.SkillRepositoryContents{
		VersionID: "ctv_1",
		Items:     []skills.SkillRepositoryContent{{Name: "Reviewer", Path: "skills/reviewer/SKILL.md", Content: "# Reviewer"}},
	})
	payload, err := json.Marshal(response)
	require.NoError(t, err)
	require.Contains(t, string(payload), `"versionId":"ctv_1"`)
	require.NotContains(t, string(payload), "commitSha")
}
