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

namespace AxCopilot.Handlers;

/// <summary>
/// Phase L3-2: 웹 검색 AI 요약 핸들러. "?!" 예약어로 사용합니다.
/// 예: ?! 최신 AI 동향    → 검색 쿼리에 대해 AI가 요약한 결과를 생성
///     ?! https://...     → 해당 URL의 내용을 AI가 요약
///
/// 조건: AiEnabled=true + InternalModeEnabled=false (사외 모드)
/// </summary>
public class WebSearchSummaryHandler : IActionHandler
{
    private readonly SettingsService _settings;
    private readonly LlmService _llm;

    public string? Prefix => "?!";

    public PluginMetadata Metadata => new(
        "WebSearchSummary",
        "웹 검색 AI 요약 — ?! 뒤에 검색어 또는 URL 입력",
        "1.0",
        "AX");

    public WebSearchSummaryHandler(SettingsService settings, LlmService llm)
    {
        _settings = settings;
        _llm      = llm;
    }

    private bool IsAvailable =>
        _settings.Settings.AiEnabled && !_settings.Settings.InternalModeEnabled;

    public Task<IEnumerable<LauncherItem>> GetItemsAsync(string query, CancellationToken ct)
    {
        // AI 비활성화 또는 사내 모드에서는 항목 표시 안 함
        if (!IsAvailable)
            return Task.FromResult<IEnumerable<LauncherItem>>(Array.Empty<LauncherItem>());

        if (string.IsNullOrWhiteSpace(query))
        {
            return Task.FromResult<IEnumerable<LauncherItem>>(
            [
                new LauncherItem(
                    "웹 검색 AI 요약",
                    "?! [검색어 또는 URL]  — AI가 검색 결과를 요약합니다",
                    null, null, Symbol: Symbols.Lightbulb)
            ]);
        }

        var q = query.Trim();
        var isUrl = q.StartsWith("http://", StringComparison.OrdinalIgnoreCase)
                 || q.StartsWith("https://", StringComparison.OrdinalIgnoreCase)
                 || (!q.Contains(' ') && q.Contains('.') && q.Length > 4);

        if (isUrl)
        {
            var url = q.StartsWith("http", StringComparison.OrdinalIgnoreCase) ? q : "https://" + q;
            return Task.FromResult<IEnumerable<LauncherItem>>(
            [
                new LauncherItem(
                    $"AI 요약: {q}",
                    "Enter → 페이지 내용을 AI가 요약하여 클립보드에 복사",
                    null, ("url", url), Symbol: Symbols.Lightbulb)
            ]);
        }
        else
        {
            // 검색 쿼리 → 기본 검색엔진 URL 사용
            var searchUrl = $"https://www.google.com/search?q={Uri.EscapeDataString(q)}";
            return Task.FromResult<IEnumerable<LauncherItem>>(
            [
                new LauncherItem(
                    $"AI 요약: '{q}'",
                    "Enter → 검색어에 대한 AI 답변 생성 후 클립보드에 복사",
                    null, ("query", q), Symbol: Symbols.Lightbulb)
            ]);
        }
    }

    public async Task ExecuteAsync(LauncherItem item, CancellationToken ct)
    {
        if (!IsAvailable) return;

        string prompt;

        switch (item.Data)
        {
            case ("url", string url):
                var content = await ContentExtractor.ExtractAsync(url, maxChars: 3000, ct);
                prompt = $"다음 웹 페이지 내용을 핵심 위주로 한국어로 요약해주세요 ({url}):\n\n{content}";
                break;

            case ("query", string q):
                prompt = $"'{q}'에 대해 최신 정보를 바탕으로 핵심을 간결하게 설명해주세요.";
                break;

            default:
                return;
        }

        try
        {
            var messages = new List<ChatMessage>
            {
                new() { Role = "system", Content = "당신은 정보를 간결하게 요약하는 전문 어시스턴트입니다. 핵심만 추려 명확하게 전달하세요." },
                new() { Role = "user",   Content = prompt }
            };

            var result = await _llm.SendAsync(messages, ct);

            if (!string.IsNullOrWhiteSpace(result))
            {
                Application.Current.Dispatcher.Invoke(() =>
                {
                    Clipboard.SetText(result);
                    NotificationService.Notify("AI 요약 완료", "결과가 클립보드에 복사되었습니다.");
                });
            }
        }
        catch (Exception ex)
        {
            LogService.Warn($"웹 검색 AI 요약 실패: {ex.Message}");
        }
    }
}
