package agent

import (
	"errors"
	"os"
	"path/filepath"
	"testing"

	"github.com/stretchr/testify/require"

	"github.com/tidbcloud/AgentTeam/desktop/internal/agent/drivercontract"
	"github.com/tidbcloud/AgentTeam/desktop/internal/agent/runtimeconfig"
)

func TestMaterializeSkillsForLaunchBuiltinCapabilityLifecycle(t *testing.T) {
	workDir := t.TempDir()
	cfg := drivercontract.LaunchConfig{
		RuntimeType: runtimeconfig.TypeCodex,
		WorkDir:     workDir,
		BuiltinSkills: []drivercontract.BuiltinSkill{{
			Name:    "memory-maintenance",
			Content: "---\nname: memory-maintenance\n---\n# Memory\n",
		}},
	}
	require.NoError(t, materializeSkillsForLaunch(cfg))
	path := filepath.Join(workDir, ".agents", "skills", "memory-maintenance", "SKILL.md")
	content, err := os.ReadFile(path)
	require.NoError(t, err)
	require.Contains(t, string(content), "name: memory-maintenance")

	cfg.BuiltinSkills = nil
	require.NoError(t, materializeSkillsForLaunch(cfg))
	require.NoFileExists(t, path)
}

func TestWriteBuiltinSkillSourceRejectsUnsafeName(t *testing.T) {
	_, _, err := writeBuiltinSkillSource([]drivercontract.BuiltinSkill{{
		Name: "../memory-maintenance", Content: "unsafe",
	}})
	require.ErrorContains(t, err, "invalid builtin skill name")
}

func TestMaterializeSkillsForLaunchCleanupFailureDoesNotFailLaunch(t *testing.T) {
	original := removeBuiltinSkillSource
	removeBuiltinSkillSource = func(string) error { return errors.New("cleanup failed") }
	t.Cleanup(func() { removeBuiltinSkillSource = original })

	workDir := t.TempDir()
	err := materializeSkillsForLaunch(drivercontract.LaunchConfig{
		RuntimeType: runtimeconfig.TypeCodex,
		WorkDir:     workDir,
		BuiltinSkills: []drivercontract.BuiltinSkill{{
			Name: "memory-maintenance", Content: "# Memory\n",
		}},
	})
	require.NoError(t, err)
	require.FileExists(t, filepath.Join(
		workDir, ".agents", "skills", "memory-maintenance", "SKILL.md"))
}
