using System.IO;
using System.Text;
using System.Text.RegularExpressions;

namespace AxCopilot.Services.Agent;

/// <summary>
/// Phase 17-D: 파일 경로에 따라 적용할 스킬을 자동 선택.
/// SKILL.md의 paths: 프론트매터 패턴 지원.
/// </summary>
public class PathBasedSkillActivator
{
    /// <summary>현재 작업 중인 파일 경로 기반으로 활성 스킬 목록 반환.</summary>
    public IReadOnlyList<SkillDefinition> GetActiveSkillsForFile(
        IReadOnlyList<SkillDefinition> allSkills, string filePath)
    {
        if (string.IsNullOrEmpty(filePath)) return Array.Empty<SkillDefinition>();

        return allSkills
            .Where(s => s.GetPathPatterns().Count > 0 &&
                        s.GetPathPatterns().Any(p => GlobMatcher.IsMatch(filePath, p)))
            .ToList();
    }

    /// <summary>활성 스킬의 컨텍스트를 시스템 프롬프트 주입용 텍스트로 빌드.</summary>
    public string BuildSkillContextInjection(IReadOnlyList<SkillDefinition> skills)
    {
        if (skills.Count == 0) return string.Empty;
        var sb = new StringBuilder();
        sb.AppendLine("## 현재 파일에 자동 적용된 스킬");
        foreach (var skill in skills)
        {
            sb.AppendLine($"### {skill.Label}");
            sb.AppendLine(skill.SystemPrompt);
            sb.AppendLine();
        }
        return sb.ToString();
    }
}

/// <summary>glob 패턴 매처. ** 와일드카드 및 *.ext 패턴 지원.</summary>
public static class GlobMatcher
{
    public static bool IsMatch(string path, string pattern)
    {
        if (string.IsNullOrEmpty(pattern) || pattern == "*") return true;
        path = path.Replace('\\', '/');
        pattern = pattern.Replace('\\', '/');

        // ** → 임의의 경로 세그먼트
        var regexPattern = "^" + Regex.Escape(pattern)
            .Replace("\\*\\*/", "(.+/)?")
            .Replace("\\*\\*", ".*")
            .Replace("\\*", "[^/]*")
            .Replace("\\?", "[^/]") + "$";

        return Regex.IsMatch(path, regexPattern, RegexOptions.IgnoreCase);
    }
}
