namespace AxCopilot.Services.Agent.SlashCommands;

/// <summary>Phase 22: /plan — 플랜 모드 토글.</summary>
public class PlanCommand : ISlashCommand
{
    public string Name => "plan";
    public string[] Aliases => Array.Empty<string>();
    public string Description => "플랜 모드를 토글하거나 계획을 설명합니다";
    public string? ArgumentHint => "[open|<계획 설명>]";
    public bool RequiresActiveSession => false;

    public async Task ExecuteAsync(string arguments, IAgentChatContext ctx, CancellationToken ct)
    {
        var llm = ctx.Settings.Settings.Llm;

        if (string.IsNullOrWhiteSpace(arguments))
        {
            // 토글: off → always → auto → off 순환
            var current = llm.PlanMode?.ToLowerInvariant() ?? "off";
            var next = current switch
            {
                "off" => "always",
                "always" => "auto",
                _ => "off",
            };
            llm.PlanMode = next;
            ctx.Settings.Save();
            ctx.UpdateSessionHeader();

            var desc = next switch
            {
                "always" => "실행 전 항상 계획을 작성하고 승인을 기다립니다",
                "auto" => "복잡한 작업에만 자동으로 계획을 작성합니다",
                _ => "변경 사항을 바로 실행합니다",
            };
            await ctx.SendSystemMessageAsync($"플랜 모드: **{next}**\n{desc}");
            return;
        }

        var arg = arguments.Trim().ToLowerInvariant();
        if (arg == "open")
        {
            await ctx.SendSystemMessageAsync(
                "현재 활성 계획이 없습니다. `/plan <설명>`으로 새 계획을 만드세요.");
            return;
        }

        // 계획 설명으로 플랜 모드 활성화 + 지시
        llm.PlanMode = "always";
        ctx.Settings.Save();
        ctx.UpdateSessionHeader();
        await ctx.SendSystemMessageAsync(
            $"플랜 모드 **활성화**. 다음 요청에서 계획을 먼저 작성합니다.\n\n요청: {arguments}");
    }
}
