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

namespace AxCopilot.Handlers;

/// <summary>
/// Phase L3-3: AI 스니펫 핸들러. "ai" 예약어로 사용합니다.
/// 예: ai email 프로젝트 일정 변경 안내   → 업무 이메일 초안 생성
///     ai summary 이 문서의 핵심 내용    → 내용 요약
///     ai (목록)                         → 등록된 AI 템플릿 목록 표시
///
/// AiEnabled=false이면 항목 자체를 표시하지 않습니다.
/// </summary>
public class AiSnippetHandler : IActionHandler
{
    private readonly SettingsService _settings;
    private readonly SnippetTemplateService _templateService;

    public string? Prefix => "ai";

    public PluginMetadata Metadata => new(
        "AiSnippet",
        "AI 스니펫 — ai [템플릿] [내용]",
        "1.0",
        "AX");

    public AiSnippetHandler(SettingsService settings, SnippetTemplateService templateService)
    {
        _settings = settings;
        _templateService = templateService;
    }

    public Task<IEnumerable<LauncherItem>> GetItemsAsync(string query, CancellationToken ct)
    {
        // AI 비활성화 시 항목 표시 안 함
        if (!(_settings.Settings.AiEnabled))
            return Task.FromResult<IEnumerable<LauncherItem>>(Array.Empty<LauncherItem>());

        var parts    = query.Trim().Split(' ', 2, StringSplitOptions.RemoveEmptyEntries);
        var keyword  = parts.Length > 0 ? parts[0] : "";
        var argument = parts.Length > 1 ? parts[1] : "";

        var templates = _templateService.Search(keyword);
        var items     = new List<LauncherItem>();

        if (templates.Count == 0)
        {
            items.Add(new LauncherItem(
                "등록된 AI 템플릿 없음",
                "설정 → AI 스니펫 탭에서 추가하세요",
                null, null, Symbol: Symbols.Lightbulb));
            return Task.FromResult<IEnumerable<LauncherItem>>(items);
        }

        foreach (var tmpl in templates)
        {
            var hasArg = !string.IsNullOrWhiteSpace(argument);
            items.Add(new LauncherItem(
                hasArg
                    ? $"[AI] {tmpl.Name}: {TruncateArg(argument)}"
                    : $"[AI] {tmpl.Name}",
                hasArg
                    ? $"Enter: AI가 생성 후 클립보드에 복사  ·  템플릿: {tmpl.Prompt}"
                    : $"ai {tmpl.Keyword} [내용]  ·  {tmpl.Prompt}",
                null,
                hasArg ? (object)(tmpl, argument) : null,
                Symbol: Symbols.Lightbulb));
        }

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

    public async Task ExecuteAsync(LauncherItem item, CancellationToken ct)
    {
        if (!_settings.Settings.AiEnabled) return;

        if (item.Data is not (AiSnippetTemplate tmpl, string arg)) return;

        try
        {
            var result = await _templateService.GenerateAsync(tmpl, arg, ct);
            if (string.IsNullOrWhiteSpace(result)) return;

            // 결과를 클립보드에 복사
            Application.Current.Dispatcher.Invoke(() =>
            {
                Clipboard.SetText(result);
                Services.NotificationService.Notify(
                    $"AI {tmpl.Name} 완료",
                    "결과가 클립보드에 복사되었습니다.");
            });
        }
        catch (Exception ex)
        {
            LogService.Warn($"AI 스니펫 생성 실패: {ex.Message}");
        }
    }

    private static string TruncateArg(string arg)
        => arg.Length > 30 ? arg[..27] + "…" : arg;
}
