using AxCopilot.Handlers;
using AxCopilot.Services;

namespace AxCopilot.ViewModels;

/// <summary>
/// Phase L3-9: 런처 하단 미니 위젯 데이터 바인딩 프로퍼티.
/// LauncherWindow.Widgets.cs의 타이머에서 UpdateWidgets()를 호출합니다.
/// </summary>
public partial class LauncherViewModel
{
    // ─── 시스템 모니터 ────────────────────────────────────────────────────────

    /// <summary>위젯 텍스트 예: "CPU 34%  RAM 62%  C:42%"</summary>
    public string Widget_PerfText
    {
        get
        {
            var p = PerformanceMonitorService.Instance;
            return $"CPU {p.CpuPercent:F0}%  RAM {p.RamPercent:F0}%  {p.DiskCText}";
        }
    }

    // ─── 뽀모도로 ─────────────────────────────────────────────────────────────

    /// <summary>위젯 텍스트 예: "집중 18:42" / "휴식 04:58" / "대기 25:00"</summary>
    public string Widget_PomoText
    {
        get
        {
            var p       = PomodoroService.Instance;
            var rem     = p.Remaining;
            var timeStr = $"{(int)rem.TotalMinutes:D2}:{rem.Seconds:D2}";
            return p.Mode switch
            {
                PomodoroMode.Focus => $"집중 {timeStr}",
                PomodoroMode.Break => $"휴식 {timeStr}",
                _                  => $"대기 {timeStr}",
            };
        }
    }

    /// <summary>뽀모도로 실행 중이면 true → 위젯 색상 강조에 사용</summary>
    public bool Widget_PomoRunning => PomodoroService.Instance.IsRunning;

    // ─── 빠른 메모 ────────────────────────────────────────────────────────────

    private int _noteCount;

    /// <summary>위젯 텍스트 예: "메모 3건" / "메모 없음"</summary>
    public string Widget_NoteText => _noteCount > 0 ? $"메모 {_noteCount}건" : "메모 없음";

    // ─── 서버 상태 ────────────────────────────────────────────────────────────

    public bool   Widget_OllamaOnline => ServerStatusService.Instance.OllamaOnline;
    public bool   Widget_LlmOnline    => ServerStatusService.Instance.LlmOnline;
    public bool   Widget_McpOnline    => ServerStatusService.Instance.McpOnline;
    public string Widget_McpName      => ServerStatusService.Instance.McpName;

    // ─── 날씨 ─────────────────────────────────────────────────────────────────

    private string _widget_WeatherText = "--";

    /// <summary>날씨 위젯 텍스트 예: "⛅ 18°C" (사외 모드) / "--" (사내 모드)</summary>
    public string Widget_WeatherText
    {
        get => _widget_WeatherText;
        internal set { _widget_WeatherText = value; OnPropertyChanged(); }
    }

    // ─── 날짜/일정 ────────────────────────────────────────────────────────────

    /// <summary>날짜 위젯 텍스트 예: "4/4 (화)"</summary>
    public string Widget_CalText =>
        DateTime.Now.ToString("M/d (ddd)",
            System.Globalization.CultureInfo.GetCultureInfo("ko-KR"));

    // ─── 배터리 ───────────────────────────────────────────────────────────────

    private string _widget_BatteryText    = "--";
    private string _widget_BatteryIcon    = "\uE83F";
    private bool   _widget_BatteryVisible = false;

    /// <summary>배터리 퍼센트 및 충전 표시. 예: "87%" / "45% ⚡"</summary>
    public string Widget_BatteryText
    {
        get => _widget_BatteryText;
        internal set { _widget_BatteryText = value; OnPropertyChanged(); }
    }

    /// <summary>배터리 잔량별 Segoe MDL2 아이콘 코드포인트</summary>
    public string Widget_BatteryIcon
    {
        get => _widget_BatteryIcon;
        internal set { _widget_BatteryIcon = value; OnPropertyChanged(); }
    }

    /// <summary>배터리 위젯 표시 여부 (데스크톱/배터리 없음이면 false)</summary>
    public bool Widget_BatteryVisible
    {
        get => _widget_BatteryVisible;
        internal set { _widget_BatteryVisible = value; OnPropertyChanged(); }
    }

    // ─── 갱신 메서드 ──────────────────────────────────────────────────────────

    /// <summary>1초마다 LauncherWindow.Widgets.cs에서 호출 — UI 바인딩 갱신.</summary>
    public void UpdateWidgets()
    {
        // 메모 건수 갱신 (파일 I/O 최소화: 5회마다 1회만)
        _widgetRefreshTick++;
        if (_widgetRefreshTick % 5 == 0)
            _noteCount = NoteHandler.GetNoteCount();

        OnPropertyChanged(nameof(Widget_PerfText));
        OnPropertyChanged(nameof(Widget_PomoText));
        OnPropertyChanged(nameof(Widget_PomoRunning));
        OnPropertyChanged(nameof(Widget_NoteText));
        OnPropertyChanged(nameof(Widget_OllamaOnline));
        OnPropertyChanged(nameof(Widget_LlmOnline));
        OnPropertyChanged(nameof(Widget_McpOnline));
        OnPropertyChanged(nameof(Widget_McpName));
        OnPropertyChanged(nameof(Widget_CalText));
        // WeatherText / BatteryText / BatteryIcon / BatteryVisible 는
        // LauncherWindow.Widgets.cs에서 직접 setter 호출로 갱신
    }

    private int _widgetRefreshTick;
}
