using AxCopilot.SDK;
using AxCopilot.Services;
using AxCopilot.Themes;

namespace AxCopilot.Handlers;

/// <summary>
/// Phase L3-9: 뽀모도로 타이머 핸들러. "pomo" 프리픽스로 사용합니다.
///
/// 사용법:
///   pomo           → 현재 타이머 상태 표시
///   pomo start     → 집중 타이머 시작 (25분)
///   pomo break     → 휴식 타이머 시작 (5분)
///   pomo stop      → 타이머 중지
///   pomo reset     → 타이머 초기화
///
/// Enter → 해당 명령 실행.
/// </summary>
public class PomoHandler : IActionHandler
{
    public string? Prefix => "pomo";

    public PluginMetadata Metadata => new(
        "Pomodoro",
        "뽀모도로 타이머 — pomo",
        "1.0",
        "AX",
        "집중/휴식 타이머를 관리합니다.");

    public Task<IEnumerable<LauncherItem>> GetItemsAsync(string query, CancellationToken ct)
    {
        var q    = query.Trim().ToLowerInvariant();
        var svc  = PomodoroService.Instance;
        var items = new List<LauncherItem>();

        // ─── 명령 분기 ────────────────────────────────────────────────────────

        if (q is "start" or "focus")
        {
            items.Add(new LauncherItem("집중 타이머 시작",
                $"{svc.FocusMinutes}분 집중 모드 시작  ·  Enter로 실행",
                null, "__START__", Symbol: Symbols.Timer));
            return Task.FromResult<IEnumerable<LauncherItem>>(items);
        }

        if (q is "break" or "rest")
        {
            items.Add(new LauncherItem("휴식 타이머 시작",
                $"{svc.BreakMinutes}분 휴식 모드 시작  ·  Enter로 실행",
                null, "__BREAK__", Symbol: Symbols.Timer));
            return Task.FromResult<IEnumerable<LauncherItem>>(items);
        }

        if (q is "stop" or "pause")
        {
            items.Add(new LauncherItem("타이머 중지",
                "현재 타이머를 중지합니다  ·  Enter로 실행",
                null, "__STOP__", Symbol: Symbols.MediaPlay));
            return Task.FromResult<IEnumerable<LauncherItem>>(items);
        }

        if (q == "reset")
        {
            items.Add(new LauncherItem("타이머 초기화",
                "타이머를 처음 상태로 초기화합니다  ·  Enter로 실행",
                null, "__RESET__", Symbol: Symbols.Restart));
            return Task.FromResult<IEnumerable<LauncherItem>>(items);
        }

        // ─── 기본: 현재 상태 + 명령 목록 ─────────────────────────────────────

        var remaining = svc.Remaining;
        var timeStr   = $"{(int)remaining.TotalMinutes:D2}:{remaining.Seconds:D2}";
        var stateStr  = svc.Mode switch
        {
            PomodoroMode.Focus => svc.IsRunning ? $"집중 중  {timeStr} 남음" : $"집중 일시정지  {timeStr} 남음",
            PomodoroMode.Break => svc.IsRunning ? $"휴식 중  {timeStr} 남음" : $"휴식 일시정지  {timeStr} 남음",
            _                  => "대기 중",
        };

        // 상태 카드
        items.Add(new LauncherItem(
            "🍅 뽀모도로 타이머",
            stateStr,
            null, null, Symbol: Symbols.Timer));

        // 빠른 명령들
        if (!svc.IsRunning)
        {
            items.Add(new LauncherItem("집중 시작",
                $"{svc.FocusMinutes}분 집중 모드 시작  ·  Enter로 실행",
                null, "__START__", Symbol: Symbols.Timer));
        }
        else
        {
            items.Add(new LauncherItem("타이머 중지",
                "현재 타이머를 중지합니다  ·  Enter로 실행",
                null, "__STOP__", Symbol: Symbols.MediaPlay));
        }

        if (svc.Mode == PomodoroMode.Focus && svc.IsRunning)
        {
            items.Add(new LauncherItem("휴식 시작",
                $"{svc.BreakMinutes}분 휴식 모드로 전환  ·  Enter로 실행",
                null, "__BREAK__", Symbol: Symbols.Timer));
        }

        items.Add(new LauncherItem("타이머 초기화",
            "타이머를 처음 상태로 초기화합니다  ·  Enter로 실행",
            null, "__RESET__", Symbol: Symbols.Restart));

        return Task.FromResult<IEnumerable<LauncherItem>>(items);
    }

    public Task ExecuteAsync(LauncherItem item, CancellationToken ct)
    {
        if (item.Data is not string cmd) return Task.CompletedTask;

        var svc = PomodoroService.Instance;
        switch (cmd)
        {
            case "__START__": svc.StartFocus(); break;
            case "__BREAK__": svc.StartBreak(); break;
            case "__STOP__":  svc.Stop();       break;
            case "__RESET__": svc.Reset();      break;
        }

        return Task.CompletedTask;
    }
}
