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

namespace AxCopilot.Handlers;

/// <summary>
/// Phase L3-8: 알림 센터 핸들러. "notif" 프리픽스로 사용합니다.
/// AX Copilot이 표시한 최근 알림 이력을 런처에서 조회합니다.
///
/// 사용법:
///   notif         → 최근 알림 이력 목록
///   notif clear   → 알림 이력 초기화
///   notif [검색어] → 제목·내용으로 필터링
///
/// Enter → 알림 내용을 클립보드에 복사.
/// </summary>
public class NotifHandler : IActionHandler
{
    public string? Prefix => "notif";

    public PluginMetadata Metadata => new(
        "NotifCenter",
        "알림 센터 — notif",
        "1.0",
        "AX",
        "AX Copilot 알림 이력을 조회합니다.");

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

        // clear 명령
        if (q.Equals("clear", StringComparison.OrdinalIgnoreCase))
        {
            var count = NotificationCenterService.History.Count;
            return Task.FromResult<IEnumerable<LauncherItem>>(
            [
                new LauncherItem(
                    $"알림 이력 초기화 ({count}건)",
                    "Enter를 눌러 전체 삭제",
                    null, "__CLEAR__",
                    Symbol: Symbols.Delete)
            ]);
        }

        var history = NotificationCenterService.History;

        // 검색어 필터
        IEnumerable<NotificationEntry> filtered = history;
        if (!string.IsNullOrEmpty(q))
        {
            filtered = history
                .Where(e => e.Title.Contains(q, StringComparison.OrdinalIgnoreCase)
                         || e.Message.Contains(q, StringComparison.OrdinalIgnoreCase));
        }

        var list = filtered.Take(12).ToList();

        if (list.Count == 0)
        {
            var emptyMsg = string.IsNullOrEmpty(q)
                ? "알림 이력이 없습니다"
                : $"'{q}'에 해당하는 알림 없음";
            return Task.FromResult<IEnumerable<LauncherItem>>(
            [
                new LauncherItem(
                    emptyMsg,
                    "AX Copilot 동작 중 발생한 알림이 여기에 표시됩니다",
                    null, null,
                    Symbol: Symbols.Info)
            ]);
        }

        var items = list
            .Select(e => new LauncherItem(
                e.Title,
                $"{e.Message}  ·  {TimeAgo(e.Timestamp)}",
                null, e,
                Symbol: GetSymbol(e)))
            .ToList<LauncherItem>();

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

    public Task ExecuteAsync(LauncherItem item, CancellationToken ct)
    {
        // 이력 초기화
        if (item.Data is string s && s == "__CLEAR__")
        {
            NotificationCenterService.ClearHistory();
            NotificationService.LogOnly("AX Copilot", "알림 이력이 초기화되었습니다.");
            return Task.CompletedTask;
        }

        // 알림 내용 클립보드 복사
        if (item.Data is NotificationEntry entry)
        {
            try
            {
                Application.Current?.Dispatcher.Invoke(() =>
                    Clipboard.SetText($"[{entry.Title}] {entry.Message}"));
            }
            catch (Exception ex)
            {
                LogService.Warn($"[NotifHandler] 클립보드 복사 실패: {ex.Message}");
            }
        }

        return Task.CompletedTask;
    }

    // ─── 내부 헬퍼 ──────────────────────────────────────────────────────────

    private static string TimeAgo(DateTime timestamp)
    {
        var diff = DateTime.Now - timestamp;
        if (diff.TotalSeconds < 60)  return "방금 전";
        if (diff.TotalMinutes < 60)  return $"{(int)diff.TotalMinutes}분 전";
        if (diff.TotalHours   < 24)  return $"{(int)diff.TotalHours}시간 전";
        return $"{(int)diff.TotalDays}일 전";
    }

    private static string GetSymbol(NotificationEntry entry) => entry.Type switch
    {
        NotificationType.Error   => Symbols.Error,
        NotificationType.Warning => Symbols.Warning,
        NotificationType.Success => Symbols.Favorite,
        _ => entry.Title switch
        {
            var t when t.Contains("태그")       => Symbols.Tag,
            var t when t.Contains("즐겨찾기")   => Symbols.Favorite,
            var t when t.Contains("저장")
                    || t.Contains("내보내기")   => Symbols.Save,
            _                                   => Symbols.ReminderBell,
        }
    };
}
