using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using AxCopilot.Services;
using AxCopilot.Services.Agent;

namespace AxCopilot.Views;

public partial class ChatWindow
{
    // ─── /help 도움말 창 ─────────────────────────────────────────────────

    private void ShowSlashHelpWindow()
    {
        var bg = ThemeResourceHelper.Background(this);
        var fg = ThemeResourceHelper.Primary(this);
        var fg2 = ThemeResourceHelper.Secondary(this);
        var accent = ThemeResourceHelper.Accent(this);
        var itemBg = ThemeResourceHelper.ItemBg(this);
        var hoverBg = ThemeResourceHelper.HoverBg(this);

        var win = new Window
        {
            Title = "AX Agent — 슬래시 명령어 도움말",
            Width = 560, Height = 640, MinWidth = 440, MinHeight = 500,
            WindowStyle = WindowStyle.None, AllowsTransparency = true,
            Background = Brushes.Transparent, ResizeMode = ResizeMode.CanResize,
            WindowStartupLocation = WindowStartupLocation.CenterOwner, Owner = this,
            Icon = Icon,
        };

        var mainBorder = new Border
        {
            Background = bg, CornerRadius = new CornerRadius(16),
            BorderBrush = ThemeResourceHelper.Border(this),
            BorderThickness = new Thickness(1), Margin = new Thickness(10),
            Effect = new System.Windows.Media.Effects.DropShadowEffect { Color = Colors.Black, BlurRadius = 20, ShadowDepth = 4, Opacity = 0.3 },
        };

        var rootGrid = new Grid();
        rootGrid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(52) });
        rootGrid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) });

        // 헤더
        var headerBorder = new Border
        {
            CornerRadius = new CornerRadius(16, 16, 0, 0),
            Background = new LinearGradientBrush(
                Color.FromRgb(26, 27, 46), Color.FromRgb(59, 78, 204),
                new Point(0, 0), new Point(1, 1)),
            Padding = new Thickness(20, 0, 20, 0),
        };
        var headerGrid = new Grid();
        var headerStack = new StackPanel { Orientation = Orientation.Horizontal, VerticalAlignment = VerticalAlignment.Center };
        headerStack.Children.Add(new TextBlock { Text = "\uE946", FontFamily = ThemeResourceHelper.SegoeMdl2, FontSize = 16, Foreground = Brushes.LightCyan, Margin = new Thickness(0, 0, 10, 0), VerticalAlignment = VerticalAlignment.Center });
        headerStack.Children.Add(new TextBlock { Text = "슬래시 명령어 (/ Commands)", FontSize = 15, FontWeight = FontWeights.SemiBold, Foreground = Brushes.White, VerticalAlignment = VerticalAlignment.Center });
        headerGrid.Children.Add(headerStack);

        var closeBtn = new Border { Width = 30, Height = 30, CornerRadius = new CornerRadius(8), Background = Brushes.Transparent, Cursor = Cursors.Hand, HorizontalAlignment = HorizontalAlignment.Right, VerticalAlignment = VerticalAlignment.Center };
        closeBtn.Child = new TextBlock { Text = "\uE711", FontFamily = ThemeResourceHelper.SegoeMdl2, FontSize = 11, Foreground = new SolidColorBrush(Color.FromArgb(136, 170, 255, 204)), HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center };
        closeBtn.MouseEnter += (_, _) => closeBtn.Background = new SolidColorBrush(Color.FromArgb(34, 255, 255, 255));
        closeBtn.MouseLeave += (_, _) => closeBtn.Background = Brushes.Transparent;
        closeBtn.MouseLeftButtonDown += (_, me) => { me.Handled = true; win.Close(); };
        headerGrid.Children.Add(closeBtn);
        headerBorder.Child = headerGrid;
        Grid.SetRow(headerBorder, 0);
        rootGrid.Children.Add(headerBorder);

        // 콘텐츠
        var scroll = new ScrollViewer { VerticalScrollBarVisibility = ScrollBarVisibility.Auto, Padding = new Thickness(20, 14, 20, 20) };
        var contentPanel = new StackPanel();

        // 설명
        contentPanel.Children.Add(new TextBlock { Text = "입력창에 /를 입력하면 사용할 수 있는 명령어가 표시됩니다.\n명령어를 선택한 후 내용을 입력하면 해당 기능이 적용됩니다.", FontSize = 12, Foreground = fg2, TextWrapping = TextWrapping.Wrap, Margin = new Thickness(0, 0, 0, 16), LineHeight = 20 });

        // 공통 명령어 섹션
        AddHelpSection(contentPanel, "📌 공통 명령어", "모든 탭(Chat, Cowork, Code)에서 사용 가능", fg, fg2, accent, itemBg, hoverBg,
            ("/summary", "텍스트/문서를 핵심 포인트 중심으로 요약합니다."),
            ("/translate", "텍스트를 영어로 번역합니다. 원문의 톤을 유지합니다."),
            ("/explain", "내용을 쉽고 자세하게 설명합니다. 예시를 포함합니다."),
            ("/fix", "맞춤법, 문법, 자연스러운 표현을 교정합니다."));

        // 개발 명령어 섹션
        AddHelpSection(contentPanel, "🛠️ 개발 명령어", "Cowork, Code 탭에서만 사용 가능", fg, fg2, accent, itemBg, hoverBg,
            ("/review", "Git diff를 분석하여 버그, 성능, 보안 이슈를 찾습니다."),
            ("/pr", "변경사항을 PR 설명 형식(Summary, Changes, Test Plan)으로 요약합니다."),
            ("/test", "코드에 대한 단위 테스트를 자동 생성합니다."),
            ("/structure", "프로젝트의 폴더/파일 구조를 분석하고 설명합니다."),
            ("/build", "프로젝트를 빌드합니다. 오류 발생 시 분석합니다."),
            ("/search", "자연어로 코드베이스를 시맨틱 검색합니다."));

        // 스킬 명령어 섹션
        var skills = SkillService.Skills;
        if (skills.Count > 0)
        {
            var skillItems = skills.Select(s => ($"/{s.Name}", s.Description)).ToArray();
            AddHelpSection(contentPanel, "⚡ 스킬 명령어", $"{skills.Count}개 로드됨 — %APPDATA%\\AxCopilot\\skills\\에서 추가 가능", fg, fg2, accent, itemBg, hoverBg, skillItems);
        }

        // 사용 팁
        contentPanel.Children.Add(new Border { Height = 1, Background = new SolidColorBrush(Color.FromArgb(30, 255, 255, 255)), Margin = new Thickness(0, 12, 0, 12) });
        var tipPanel = new StackPanel();
        tipPanel.Children.Add(new TextBlock { Text = "💡 사용 팁", FontSize = 13, FontWeight = FontWeights.SemiBold, Foreground = fg, Margin = new Thickness(0, 0, 0, 8) });
        var tips = new[]
        {
            "/ 입력 시 현재 탭에 맞는 명령어만 자동완성됩니다.",
            "파일을 드래그하면 유형별 AI 액션 팝업이 나타납니다.",
            "스킬 파일(*.skill.md)을 추가하면 나만의 워크플로우를 만들 수 있습니다.",
            "Cowork/Code 탭에서 에이전트가 도구를 활용하여 더 강력한 작업을 수행합니다.",
        };
        foreach (var tip in tips)
        {
            tipPanel.Children.Add(new TextBlock { Text = $"• {tip}", FontSize = 12, Foreground = fg2, Margin = new Thickness(8, 2, 0, 2), TextWrapping = TextWrapping.Wrap, LineHeight = 18 });
        }
        contentPanel.Children.Add(tipPanel);

        scroll.Content = contentPanel;
        Grid.SetRow(scroll, 1);
        rootGrid.Children.Add(scroll);

        mainBorder.Child = rootGrid;
        win.Content = mainBorder;
        // 헤더 영역에서만 드래그 이동 (닫기 버튼 클릭 방해 방지)
        headerBorder.MouseLeftButtonDown += (_, me) => { try { win.DragMove(); } catch (Exception) { /* 드래그 이동 실패 — 마우스 릴리즈 시 발생 가능 */ } };
        win.ShowDialog();
    }

    private static void AddHelpSection(StackPanel parent, string title, string subtitle,
        Brush fg, Brush fg2, Brush accent, Brush itemBg, Brush hoverBg,
        params (string Cmd, string Desc)[] items)
    {
        parent.Children.Add(new TextBlock { Text = title, FontSize = 14, FontWeight = FontWeights.SemiBold, Foreground = fg, Margin = new Thickness(0, 8, 0, 2) });
        parent.Children.Add(new TextBlock { Text = subtitle, FontSize = 11, Foreground = fg2, Margin = new Thickness(0, 0, 0, 8) });

        foreach (var (cmd, desc) in items)
        {
            var row = new Border { Background = itemBg, CornerRadius = new CornerRadius(8), Padding = new Thickness(12, 8, 12, 8), Margin = new Thickness(0, 3, 0, 3) };
            var grid = new Grid();
            grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(120) });
            grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });

            var cmdText = new TextBlock { Text = cmd, FontSize = 13, FontWeight = FontWeights.SemiBold, Foreground = accent, VerticalAlignment = VerticalAlignment.Center, FontFamily = ThemeResourceHelper.Consolas };
            Grid.SetColumn(cmdText, 0);
            grid.Children.Add(cmdText);

            var descText = new TextBlock { Text = desc, FontSize = 12, Foreground = fg2, VerticalAlignment = VerticalAlignment.Center, TextWrapping = TextWrapping.Wrap };
            Grid.SetColumn(descText, 1);
            grid.Children.Add(descText);

            row.Child = grid;
            row.MouseEnter += (_, _) => row.Background = hoverBg;
            row.MouseLeave += (_, _) => row.Background = itemBg;
            parent.Children.Add(row);
        }
    }
}
