using System.Collections.Concurrent;

namespace AxCopilot.Services;

/// <summary>알림 타입.</summary>
public enum NotificationType { Info, Success, Warning, Error }

/// <summary>알림 항목.</summary>
public record NotificationEntry(
    string Title,
    string Message,
    NotificationType Type,
    DateTime Timestamp);

/// <summary>
/// Phase L3-7: 알림 센터 — 앱 전체에서 알림을 발행하고 이력을 관리합니다.
/// 트레이 BalloonTip + 인앱 알림 큐를 결합합니다.
/// </summary>
public static class NotificationCenterService
{
    private const int MaxHistory = 50;

    private static readonly ConcurrentQueue<NotificationEntry> _history = new();

    /// <summary>새 알림 발행 이벤트. UI 계층에서 구독하여 인앱 알림 표시에 활용합니다.</summary>
    public static event EventHandler<NotificationEntry>? NotificationRaised;

    /// <summary>최근 알림 이력 (최대 50건, 최신 순).</summary>
    public static IReadOnlyList<NotificationEntry> History
    {
        get
        {
            var list = _history.ToArray();
            Array.Reverse(list);
            return list;
        }
    }

    /// <summary>알림을 발행합니다. 트레이 BalloonTip + 이벤트를 동시에 발화합니다.</summary>
    public static void Show(string title, string message, NotificationType type = NotificationType.Info)
    {
        var entry = new NotificationEntry(title, message, type, DateTime.Now);

        // 이력 추가 (최대 50건 유지)
        _history.Enqueue(entry);
        while (_history.Count > MaxHistory && _history.TryDequeue(out _)) { }

        // 트레이 BalloonTip (기존 NotificationService 위임)
        NotificationService.Notify(title, message);

        // 구독자에게 이벤트 발화 (UI 인앱 알림용)
        try { NotificationRaised?.Invoke(null, entry); }
        catch (Exception) { /* 구독자 예외 무시 */ }
    }

    /// <summary>성공 알림.</summary>
    public static void ShowSuccess(string title, string message)
        => Show(title, message, NotificationType.Success);

    /// <summary>경고 알림.</summary>
    public static void ShowWarning(string title, string message)
        => Show(title, message, NotificationType.Warning);

    /// <summary>오류 알림.</summary>
    public static void ShowError(string title, string message)
        => Show(title, message, NotificationType.Error);

    /// <summary>에이전트 작업 완료 알림 (BackgroundAgentService 전용 편의 메서드).</summary>
    public static void NotifyAgentCompleted(string agentType, string? result)
    {
        var preview = result?.Length > 80 ? result[..77] + "…" : result ?? "완료";
        Show($"{agentType} 에이전트 완료", preview, NotificationType.Success);
    }

    /// <summary>이력을 초기화합니다.</summary>
    public static void ClearHistory()
    {
        while (_history.TryDequeue(out _)) { }
    }
}
