using System.IO;
using System.Windows;
using AxCopilot.SDK;
using AxCopilot.Services;
using AxCopilot.Themes;

namespace AxCopilot.Handlers;

/// <summary>
/// 빠른 메모 핸들러. "note" 프리픽스로 사용합니다.
/// 예: note              → 최근 메모 10개 목록 (Enter로 클립보드 복사)
///     note 내일 회의 9시 → 메모 저장 (타임스탬프 자동 추가)
///     note clear        → 전체 메모 삭제
/// 저장 위치: %APPDATA%\AxCopilot\notes.txt
/// </summary>
public class NoteHandler : IActionHandler
{
    public string? Prefix => "note";

    public PluginMetadata Metadata => new(
        "Note",
        "빠른 메모 — note 뒤에 내용 입력",
        "1.0",
        "AX");

    private static readonly string NotesFile = Path.Combine(
        Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
        "AxCopilot", "notes.txt");

    public Task<IEnumerable<LauncherItem>> GetItemsAsync(string query, CancellationToken ct)
    {
        var q = query.Trim();

        // ─── 비어 있으면 최근 메모 목록 ──────────────────────────────────────
        if (string.IsNullOrWhiteSpace(q))
        {
            var notes = ReadNotes();
            if (!notes.Any())
            {
                return Task.FromResult<IEnumerable<LauncherItem>>(
                [
                    new LauncherItem(
                        "메모가 없습니다",
                        "note 뒤에 내용을 입력하면 저장됩니다",
                        null, null, Symbol: Symbols.Note)
                ]);
            }

            var items = notes.Take(10).Select(n => new LauncherItem(
                n.Content.Length > 60 ? n.Content[..57] + "…" : n.Content,
                $"{n.SavedAt:yyyy-MM-dd HH:mm}  ·  Enter 복사 · Delete 삭제",
                null,
                n.Content,
                Symbol: Symbols.Note)).ToList();

            // 전체 삭제 항목
            items.Add(new LauncherItem(
                "전체 메모 삭제",
                $"총 {notes.Count}개 메모 모두 삭제  ·  Enter로 실행",
                null,
                "__CLEAR__",
                Symbol: Symbols.Delete));

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

        // ─── "clear" 명령 ─────────────────────────────────────────────────
        if (q.Equals("clear", StringComparison.OrdinalIgnoreCase))
        {
            var count = ReadNotes().Count;
            return Task.FromResult<IEnumerable<LauncherItem>>(
            [
                new LauncherItem(
                    $"전체 메모 삭제 ({count}개)",
                    "모든 메모를 삭제합니다  ·  Enter로 실행",
                    null,
                    "__CLEAR__",
                    Symbol: Symbols.Delete)
            ]);
        }

        // ─── 새 메모 저장 미리보기 ────────────────────────────────────────────
        return Task.FromResult<IEnumerable<LauncherItem>>(
        [
            new LauncherItem(
                $"메모 저장: {(q.Length > 60 ? q[..57] + "…" : q)}",
                $"{DateTime.Now:yyyy-MM-dd HH:mm}  ·  Enter로 저장",
                null,
                new ValueTuple<string, string>("__SAVE__", q),
                Symbol: Symbols.Note)
        ]);
    }

    public Task ExecuteAsync(LauncherItem item, CancellationToken ct)
    {
        switch (item.Data)
        {
            // ValueTuple<string,string> 명시적 타입 매칭 (object? 패턴 안전하게)
            case ValueTuple<string, string> t when t.Item1 == "__SAVE__":
                SaveNote(t.Item2);
                NotificationService.Notify("AX Copilot",
                    $"메모 저장됨: {(t.Item2.Length > 30 ? t.Item2[..27] + "…" : t.Item2)}");
                break;

            case string text when text == "__CLEAR__":
                ClearNotes();
                break;

            case string text:
                try { Clipboard.SetText(text); } catch (Exception) { }
                break;
        }
        return Task.CompletedTask;
    }

    // ─── 파일 I/O ──────────────────────────────────────────────────────────────

    private static void SaveNote(string content)
    {
        try
        {
            Directory.CreateDirectory(Path.GetDirectoryName(NotesFile)!);
            var line = $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] {content}{Environment.NewLine}";
            File.AppendAllText(NotesFile, line, System.Text.Encoding.UTF8);
        }
        catch (Exception ex)
        {
            LogService.Warn($"메모 저장 실패: {ex.Message}");
        }
    }

    private static List<NoteEntry> ReadNotes()
    {
        var result = new List<NoteEntry>();
        if (!File.Exists(NotesFile)) return result;

        try
        {
            var lines = File.ReadAllLines(NotesFile, System.Text.Encoding.UTF8);
            foreach (var line in lines.Reverse())
            {
                if (string.IsNullOrWhiteSpace(line)) continue;

                // 형식: [yyyy-MM-dd HH:mm:ss] 내용
                if (line.StartsWith('[') && line.Length > 21 && line[20] == ']')
                {
                    if (DateTime.TryParse(line[1..20], out var dt))
                    {
                        result.Add(new NoteEntry(dt, line[22..].Trim()));
                        continue;
                    }
                }
                result.Add(new NoteEntry(DateTime.MinValue, line.Trim()));
            }
        }
        catch (Exception ex)
        {
            LogService.Warn($"메모 읽기 실패: {ex.Message}");
        }

        return result;
    }

    private static void ClearNotes()
    {
        try
        {
            if (File.Exists(NotesFile))
                File.Delete(NotesFile);
        }
        catch (Exception ex)
        {
            LogService.Warn($"메모 삭제 실패: {ex.Message}");
        }
    }

    /// <summary>저장된 메모 건수를 반환합니다 (위젯 표시용).</summary>
    public static int GetNoteCount() => ReadNotes().Count;

    /// <summary>
    /// 특정 메모 1건 삭제. content가 일치하는 가장 최근 항목을 제거합니다.
    /// </summary>
    public static bool DeleteNote(string content)
    {
        try
        {
            if (!File.Exists(NotesFile)) return false;

            var lines = File.ReadAllLines(NotesFile, System.Text.Encoding.UTF8).ToList();
            // 뒤에서부터 찾아 가장 최근 일치 항목 제거
            for (int i = lines.Count - 1; i >= 0; i--)
            {
                var line = lines[i];
                if (string.IsNullOrWhiteSpace(line)) continue;

                string extracted;
                if (line.StartsWith('[') && line.Length > 21 && line[20] == ']')
                    extracted = line[22..].Trim();
                else
                    extracted = line.Trim();

                if (extracted == content)
                {
                    lines.RemoveAt(i);
                    File.WriteAllLines(NotesFile, lines, System.Text.Encoding.UTF8);
                    return true;
                }
            }
        }
        catch (Exception ex)
        {
            LogService.Warn($"메모 개별 삭제 실패: {ex.Message}");
        }
        return false;
    }
}

internal record NoteEntry(DateTime SavedAt, string Content);
