using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Input;
using System.Windows.Media;

namespace AxCopilot.Views;

public partial class ChatWindow
{
    // ─── 드래그 앤 드롭 AI 액션 팝업 ─────────────────────────────────────

    private static readonly Dictionary<string, List<(string Label, string Icon, string Prompt)>> DropActions = new(StringComparer.OrdinalIgnoreCase)
    {
        ["code"] =
        [
            ("코드 리뷰", "\uE943", "첨부된 코드를 리뷰해 주세요. 버그, 성능 이슈, 보안 취약점, 개선점을 찾아 구체적으로 제안하세요."),
            ("코드 설명", "\uE946", "첨부된 코드를 상세히 설명해 주세요. 주요 함수, 데이터 흐름, 설계 패턴을 포함하세요."),
            ("리팩토링 제안", "\uE70F", "첨부된 코드의 리팩토링 방안을 제안해 주세요. 가독성, 유지보수성, 성능을 고려하세요."),
            ("테스트 생성", "\uE9D5", "첨부된 코드에 대한 단위 테스트 코드를 생성해 주세요."),
        ],
        ["document"] =
        [
            ("요약", "\uE8AB", "첨부된 문서를 핵심 포인트 위주로 간결하게 요약해 주세요."),
            ("분석", "\uE9D9", "첨부된 문서의 내용을 분석하고 주요 인사이트를 도출해 주세요."),
            ("번역", "\uE8C1", "첨부된 문서를 영어로 번역해 주세요. 원문의 톤과 뉘앙스를 유지하세요."),
        ],
        ["data"] =
        [
            ("데이터 분석", "\uE9D9", "첨부된 데이터를 분석해 주세요. 통계, 추세, 이상치를 찾아 보고하세요."),
            ("시각화 제안", "\uE9D9", "첨부된 데이터를 시각화할 최적의 차트 유형을 제안하고 chart_create로 생성해 주세요."),
            ("포맷 변환", "\uE8AB", "첨부된 데이터를 다른 형식으로 변환해 주세요. (CSV↔JSON↔Excel 등)"),
        ],
        ["image"] =
        [
            ("이미지 설명", "\uE946", "첨부된 이미지를 자세히 설명해 주세요. 내용, 레이아웃, 텍스트를 분석하세요."),
            ("UI 리뷰", "\uE70F", "첨부된 UI 스크린샷을 리뷰해 주세요. UX 개선점, 접근성, 디자인 일관성을 평가하세요."),
        ],
    };

    private static readonly HashSet<string> CodeExtensions = new(StringComparer.OrdinalIgnoreCase)
        { ".cs", ".py", ".js", ".ts", ".tsx", ".jsx", ".java", ".cpp", ".c", ".h", ".go", ".rs", ".rb", ".php", ".swift", ".kt", ".scala", ".sh", ".ps1", ".bat", ".cmd", ".sql", ".xaml", ".vue" };
    private static readonly HashSet<string> DataExtensions = new(StringComparer.OrdinalIgnoreCase)
        { ".csv", ".json", ".xml", ".yaml", ".yml", ".tsv" };
    // ImageExtensions는 이미지 첨부 영역에서 정의됨 — 재사용

    private Popup? _dropActionPopup;

    private void ShowDropActionMenu(string[] files)
    {
        // 파일 유형 판별
        var ext = System.IO.Path.GetExtension(files[0]).ToLowerInvariant();
        string category;
        if (CodeExtensions.Contains(ext)) category = "code";
        else if (DataExtensions.Contains(ext)) category = "data";
        else if (ImageExtensions.Contains(ext)) category = "image";
        else category = "document";

        var actions = DropActions.GetValueOrDefault(category) ?? DropActions["document"];

        // 팝업 생성
        _dropActionPopup?.SetValue(Popup.IsOpenProperty, false);

        var panel = new StackPanel();
        // 헤더
        var header = new TextBlock
        {
            Text = $"📎 {System.IO.Path.GetFileName(files[0])}{(files.Length > 1 ? $" 외 {files.Length - 1}개" : "")}",
            FontSize = 11,
            Foreground = ThemeResourceHelper.Secondary(this),
            Margin = new Thickness(12, 8, 12, 6),
        };
        panel.Children.Add(header);

        // 액션 항목
        var hoverBrush = ThemeResourceHelper.HoverBg(this);
        var accentBrush = ThemeResourceHelper.Accent(this);
        var textBrush = ThemeResourceHelper.Primary(this);

        foreach (var (label, icon, prompt) in actions)
        {
            var capturedPrompt = prompt;
            var row = new Border
            {
                Background = Brushes.Transparent,
                CornerRadius = new CornerRadius(6),
                Padding = new Thickness(12, 7, 12, 7),
                Margin = new Thickness(4, 1, 4, 1),
                Cursor = Cursors.Hand,
            };
            var stack = new StackPanel { Orientation = Orientation.Horizontal };
            stack.Children.Add(new TextBlock
            {
                Text = icon,
                FontFamily = ThemeResourceHelper.SegoeMdl2,
                FontSize = 13, Foreground = accentBrush,
                VerticalAlignment = VerticalAlignment.Center,
                Margin = new Thickness(0, 0, 8, 0),
            });
            stack.Children.Add(new TextBlock
            {
                Text = label, FontSize = 13, FontWeight = FontWeights.SemiBold,
                Foreground = textBrush, VerticalAlignment = VerticalAlignment.Center,
            });
            row.Child = stack;

            row.MouseEnter += (_, _) => row.Background = hoverBrush;
            row.MouseLeave += (_, _) => row.Background = Brushes.Transparent;
            row.MouseLeftButtonUp += (_, _) =>
            {
                if (_dropActionPopup != null) _dropActionPopup.IsOpen = false;
                foreach (var f in files) AddAttachedFile(f);
                InputBox.Text = capturedPrompt;
                InputBox.CaretIndex = InputBox.Text.Length;
                InputBox.Focus();
                if (Llm.DragDropAutoSend)
                    _ = SendMessageAsync();
            };
            panel.Children.Add(row);
        }

        // "첨부만" 항목
        var attachOnly = new Border
        {
            Background = Brushes.Transparent,
            CornerRadius = new CornerRadius(6),
            Padding = new Thickness(12, 7, 12, 7),
            Margin = new Thickness(4, 1, 4, 1),
            Cursor = Cursors.Hand,
        };
        var attachStack = new StackPanel { Orientation = Orientation.Horizontal };
        attachStack.Children.Add(new TextBlock
        {
            Text = "\uE723",
            FontFamily = ThemeResourceHelper.SegoeMdl2,
            FontSize = 13, Foreground = ThemeResourceHelper.Secondary(this),
            VerticalAlignment = VerticalAlignment.Center,
            Margin = new Thickness(0, 0, 8, 0),
        });
        attachStack.Children.Add(new TextBlock
        {
            Text = "첨부만", FontSize = 13,
            Foreground = ThemeResourceHelper.Secondary(this),
            VerticalAlignment = VerticalAlignment.Center,
        });
        attachOnly.Child = attachStack;
        attachOnly.MouseEnter += (_, _) => attachOnly.Background = hoverBrush;
        attachOnly.MouseLeave += (_, _) => attachOnly.Background = Brushes.Transparent;
        attachOnly.MouseLeftButtonUp += (_, _) =>
        {
            if (_dropActionPopup != null) _dropActionPopup.IsOpen = false;
            foreach (var f in files) AddAttachedFile(f);
            InputBox.Focus();
        };
        panel.Children.Add(attachOnly);

        var container = new Border
        {
            Background = ThemeResourceHelper.Background(this),
            CornerRadius = new CornerRadius(12),
            BorderBrush = ThemeResourceHelper.Border(this),
            BorderThickness = new Thickness(1),
            Padding = new Thickness(4, 4, 4, 6),
            Child = panel,
            MinWidth = 200,
            Effect = new System.Windows.Media.Effects.DropShadowEffect
            {
                Color = Colors.Black, BlurRadius = 16, ShadowDepth = 4, Opacity = 0.3,
            },
        };

        _dropActionPopup = new Popup
        {
            PlacementTarget = InputBorder,
            Placement = PlacementMode.Top,
            StaysOpen = false,
            AllowsTransparency = true,
            PopupAnimation = PopupAnimation.Fade,
            Child = container,
        };
        _dropActionPopup.IsOpen = true;
    }
}
