using System.Diagnostics;
using System.IO;

namespace AxCopilot.Services.Agent.SlashCommands;

/// <summary>Phase 22: /memory — AX.md 메모리 파일 편집.</summary>
public class MemoryCommand : ISlashCommand
{
    public string Name => "memory";
    public string[] Aliases => Array.Empty<string>();
    public string Description => "AX.md 메모리 파일을 편집합니다 (전역/프로젝트/로컬)";
    public string? ArgumentHint => "[global|project|local]";
    public bool RequiresActiveSession => false;

    public async Task ExecuteAsync(string arguments, IAgentChatContext ctx, CancellationToken ct)
    {
        var scope = arguments.Trim().ToLowerInvariant() switch
        {
            "global" or "user" => "user",
            "local" => "local",
            _ => "project",
        };

        var path = scope switch
        {
            "user" => Path.Combine(
                Environment.GetFolderPath(Environment.SpecialFolder.UserProfile),
                ".axcopilot", "AX.md"),
            "local" => Path.Combine(ctx.WorkFolder, "AX.local.md"),
            _ => Path.Combine(ctx.WorkFolder, "AX.md"),
        };

        // 디렉토리 확인
        var dir = Path.GetDirectoryName(path);
        if (!string.IsNullOrEmpty(dir) && !Directory.Exists(dir))
            Directory.CreateDirectory(dir);

        // 파일이 없으면 템플릿 생성
        if (!File.Exists(path))
        {
            await File.WriteAllTextAsync(path,
                $"# AX Copilot 메모리 ({scope})\n\n여기에 프로젝트 지시사항을 작성하세요.\n", ct);
        }

        try
        {
            Process.Start(new ProcessStartInfo(path) { UseShellExecute = true });
            await ctx.SendSystemMessageAsync(
                $"메모리 파일을 열었습니다: `{path}`\n범위: **{scope}**\n편집 후 저장하면 다음 세션부터 반영됩니다.");
        }
        catch (Exception ex)
        {
            await ctx.SendSystemMessageAsync($"파일 열기 실패: {ex.Message}\n경로: {path}");
        }
    }
}
