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

namespace AxCopilot.Views;

public partial class ChatWindow
{
    // ─── 하단 바 ──────────────────────────────────────────────────────────

    /// <summary>선택된 디자인 무드 키 (HtmlSkill에서 사용).</summary>
    private string _selectedMood = null!; // Loaded 이벤트에서 초기화
    private string _selectedLanguage = "auto"; // Code 탭 개발 언어
    private string _folderDataUsage = null!; // Loaded 이벤트에서 초기화

    /// <summary>하단 바를 구성합니다 (포맷 + 디자인 드롭다운 버튼).</summary>
    private void BuildBottomBar()
    {
        MoodIconPanel.Children.Clear();

        var secondaryText = ThemeResourceHelper.Secondary(this);

        // ── 포맷 버튼 ──
        var currentFormat = Llm.DefaultOutputFormat ?? "auto";
        var formatLabel = GetFormatLabel(currentFormat);
        var formatBtn = CreateFolderBarButton("\uE9F9", formatLabel, "보고서 형태 선택", "#8B5CF6");
        formatBtn.MouseLeftButtonUp += (_, e) => { e.Handled = true; ShowFormatMenu(); };
        // Name 등록 (Popup PlacementTarget용)
        try { RegisterName("BtnFormatMenu", formatBtn); } catch (Exception) { try { UnregisterName("BtnFormatMenu"); RegisterName("BtnFormatMenu", formatBtn); } catch (Exception) { /* 이름 등록 실패 */ } }
        MoodIconPanel.Children.Add(formatBtn);

        // 구분선
        MoodIconPanel.Children.Add(new Border
        {
            Width = 1, Height = 18,
            Background = ThemeResourceHelper.Separator(this),
            Margin = new Thickness(4, 0, 4, 0),
            VerticalAlignment = VerticalAlignment.Center,
        });

        // ── 디자인 버튼 (소극 스타일) ──
        var currentMood = TemplateService.AllMoods.FirstOrDefault(m => m.Key == _selectedMood);
        var moodLabel = currentMood?.Label ?? "모던";
        var moodIcon = currentMood?.Icon ?? "🔷";
        var moodBtn = CreateFolderBarButton(null, $"{moodIcon} {moodLabel}", "디자인 무드 선택");
        moodBtn.MouseLeftButtonUp += (_, e) => { e.Handled = true; ShowMoodMenu(); };
        try { RegisterName("BtnMoodMenu", moodBtn); } catch (Exception) { try { UnregisterName("BtnMoodMenu"); RegisterName("BtnMoodMenu", moodBtn); } catch (Exception) { /* 이름 등록 실패 */ } }
        MoodIconPanel.Children.Add(moodBtn);

        // 구분선
        MoodIconPanel.Children.Add(new Border
        {
            Width = 1, Height = 18,
            Background = ThemeResourceHelper.Separator(this),
            Margin = new Thickness(4, 0, 4, 0),
            VerticalAlignment = VerticalAlignment.Center,
        });

        // ── 파일 탐색기 토글 버튼 ──
        var fileBrowserBtn = CreateFolderBarButton("\uED25", "파일", "파일 탐색기 열기/닫기", "#D97706");
        fileBrowserBtn.MouseLeftButtonUp += (_, e) => { e.Handled = true; ToggleFileBrowser(); };
        MoodIconPanel.Children.Add(fileBrowserBtn);

        // ── 실행 이력 상세도 버튼 ──
        AppendLogLevelButton();

        // 구분선 표시
        if (FormatMoodSeparator != null) FormatMoodSeparator.Visibility = Visibility.Visible;
    }

    /// <summary>Code 탭 하단 바: 개발 언어 선택 + 파일 탐색기 토글.</summary>
    private void BuildCodeBottomBar()
    {
        MoodIconPanel.Children.Clear();

        var secondaryText = ThemeResourceHelper.Secondary(this);

        // 개발 언어 선택 버튼
        var langLabel = _selectedLanguage switch
        {
            "python" => "🐍 Python",
            "java" => "☕ Java",
            "csharp" => "🔷 C#",
            "cpp" => "⚙ C++",
            "javascript" => "🌐 JavaScript",
            _ => "🔧 자동 감지",
        };
        var langBtn = CreateFolderBarButton(null, langLabel, "개발 언어 선택");
        langBtn.MouseLeftButtonUp += (_, e) => { e.Handled = true; ShowLanguageMenu(); };
        try { RegisterName("BtnLangMenu", langBtn); } catch (Exception) { try { UnregisterName("BtnLangMenu"); RegisterName("BtnLangMenu", langBtn); } catch (Exception) { /* 이름 등록 실패 */ } }
        MoodIconPanel.Children.Add(langBtn);

        // 구분선
        MoodIconPanel.Children.Add(new Border
        {
            Width = 1, Height = 18,
            Background = ThemeResourceHelper.Separator(this),
            Margin = new Thickness(4, 0, 4, 0),
            VerticalAlignment = VerticalAlignment.Center,
        });

        // 파일 탐색기 토글
        var fileBrowserBtn = CreateFolderBarButton("\uED25", "파일", "파일 탐색기 열기/닫기", "#D97706");
        fileBrowserBtn.MouseLeftButtonUp += (_, e) => { e.Handled = true; ToggleFileBrowser(); };
        MoodIconPanel.Children.Add(fileBrowserBtn);

        // ── 실행 이력 상세도 버튼 ──
        AppendLogLevelButton();

        if (FormatMoodSeparator != null) FormatMoodSeparator.Visibility = Visibility.Visible;
    }

    /// <summary>하단 바에 실행 이력 상세도 선택 버튼을 추가합니다.</summary>
    private void AppendLogLevelButton()
    {
        // 구분선
        MoodIconPanel.Children.Add(new Border
        {
            Width = 1, Height = 18,
            Background = ThemeResourceHelper.Separator(this),
            Margin = new Thickness(4, 0, 4, 0),
            VerticalAlignment = VerticalAlignment.Center,
        });

        var currentLevel = Llm.AgentLogLevel ?? "simple";
        var levelLabel = currentLevel switch
        {
            "debug" => "디버그",
            "detailed" => "상세",
            _ => "간략",
        };
        var logBtn = CreateFolderBarButton("\uE946", levelLabel, "실행 이력 상세도", "#059669");
        logBtn.MouseLeftButtonUp += (_, e) => { e.Handled = true; ShowLogLevelMenu(); };
        try { RegisterName("BtnLogLevelMenu", logBtn); } catch (Exception) { try { UnregisterName("BtnLogLevelMenu"); RegisterName("BtnLogLevelMenu", logBtn); } catch (Exception) { /* 이름 등록 실패 */ } }
        MoodIconPanel.Children.Add(logBtn);
    }

    /// <summary>실행 이력 상세도 팝업 메뉴를 표시합니다.</summary>
    private void ShowLogLevelMenu()
    {
        FormatMenuItems.Children.Clear();
        var primaryText = ThemeResourceHelper.Primary(this);
        var accentBrush = ThemeResourceHelper.Accent(this);
        var secondaryText = ThemeResourceHelper.Secondary(this);

        var levels = new (string Key, string Label, string Desc)[]
        {
            ("simple", "Simple (간략)", "도구 결과만 한 줄로 표시"),
            ("detailed", "Detailed (상세)", "도구 호출/결과 + 접이식 상세"),
            ("debug", "Debug (디버그)", "모든 정보 + 파라미터 표시"),
        };

        var current = Llm.AgentLogLevel ?? "simple";

        foreach (var (key, label, desc) in levels)
        {
            var isActive = current == key;
            var sp = new StackPanel { Orientation = Orientation.Horizontal };
            sp.Children.Add(CreateCheckIcon(isActive, accentBrush));
            sp.Children.Add(new TextBlock
            {
                Text = label,
                FontSize = 13,
                Foreground = isActive ? accentBrush : primaryText,
                VerticalAlignment = VerticalAlignment.Center,
                Margin = new Thickness(0, 0, 8, 0),
            });
            sp.Children.Add(new TextBlock
            {
                Text = desc,
                FontSize = 10,
                Foreground = secondaryText,
                VerticalAlignment = VerticalAlignment.Center,
            });

            var item = new Border
            {
                Child = sp,
                Padding = new Thickness(12, 8, 12, 8),
                CornerRadius = new CornerRadius(6),
                Background = Brushes.Transparent,
                Cursor = Cursors.Hand,
            };
            var hoverBg = ThemeResourceHelper.HoverBg(this);
            item.MouseEnter += (s, _) => ((Border)s!).Background = hoverBg;
            item.MouseLeave += (s, _) => ((Border)s!).Background = Brushes.Transparent;
            item.MouseLeftButtonUp += (_, _) =>
            {
                Llm.AgentLogLevel = key;
                _settings.Save();
                FormatMenuPopup.IsOpen = false;
                if (_activeTab == "Cowork") BuildBottomBar();
                else if (_activeTab == "Code") BuildCodeBottomBar();
            };
            FormatMenuItems.Children.Add(item);
        }

        try
        {
            var target = FindName("BtnLogLevelMenu") as UIElement;
            if (target != null) FormatMenuPopup.PlacementTarget = target;
        }
        catch (Exception) { /* 비핵심 작업 실패 — UI 차단 방지 */ }
        FormatMenuPopup.IsOpen = true;
    }

    private void ShowLanguageMenu()
    {
        FormatMenuItems.Children.Clear();
        var primaryText = ThemeResourceHelper.Primary(this);
        var accentBrush = ThemeResourceHelper.Accent(this);

        var languages = new (string Key, string Label, string Icon)[]
        {
            ("auto", "자동 감지", "🔧"),
            ("python", "Python", "🐍"),
            ("java", "Java", "☕"),
            ("csharp", "C# (.NET)", "🔷"),
            ("cpp", "C/C++", "⚙"),
            ("javascript", "JavaScript / Vue", "🌐"),
        };

        foreach (var (key, label, icon) in languages)
        {
            var isActive = _selectedLanguage == key;
            var sp = new StackPanel { Orientation = Orientation.Horizontal };
            sp.Children.Add(CreateCheckIcon(isActive, accentBrush));
            sp.Children.Add(new TextBlock { Text = icon, FontSize = 13, VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0, 0, 8, 0) });
            sp.Children.Add(new TextBlock { Text = label, FontSize = 13, Foreground = isActive ? accentBrush : primaryText, FontWeight = isActive ? FontWeights.SemiBold : FontWeights.Normal });

            var itemBorder = new Border
            {
                Child = sp, Background = Brushes.Transparent,
                CornerRadius = new CornerRadius(8), Cursor = Cursors.Hand,
                Padding = new Thickness(8, 7, 12, 7),
            };
            ApplyMenuItemHover(itemBorder);

            var capturedKey = key;
            itemBorder.MouseLeftButtonUp += (_, _) =>
            {
                FormatMenuPopup.IsOpen = false;
                _selectedLanguage = capturedKey;
                BuildCodeBottomBar();
            };
            FormatMenuItems.Children.Add(itemBorder);
        }

        if (FindName("BtnLangMenu") is UIElement langTarget)
            FormatMenuPopup.PlacementTarget = langTarget;
        FormatMenuPopup.IsOpen = true;
    }

    /// <summary>폴더바 내 드롭다운 버튼 (소극/적극 스타일과 동일)</summary>
    private Border CreateFolderBarButton(string? mdlIcon, string label, string tooltip, string? iconColorHex = null)
    {
        var secondaryText = ThemeResourceHelper.Secondary(this);
        var iconColor = iconColorHex != null ? BrushFromHex(iconColorHex) : secondaryText;
        var sp = new StackPanel { Orientation = Orientation.Horizontal };

        if (mdlIcon != null)
        {
            sp.Children.Add(new TextBlock
            {
                Text = mdlIcon,
                FontFamily = ThemeResourceHelper.SegoeMdl2,
                FontSize = 12,
                Foreground = iconColor,
                VerticalAlignment = VerticalAlignment.Center,
                Margin = new Thickness(0, 0, 4, 0),
            });
        }

        sp.Children.Add(new TextBlock
        {
            Text = label,
            FontSize = 12,
            Foreground = secondaryText,
            VerticalAlignment = VerticalAlignment.Center,
        });

        return new Border
        {
            Child = sp,
            Background = Brushes.Transparent,
            Padding = new Thickness(6, 4, 6, 4),
            Cursor = Cursors.Hand,
            ToolTip = tooltip,
        };
    }

    private static string GetFormatLabel(string key) => key switch
    {
        "xlsx" => "Excel",
        "html" => "HTML 보고서",
        "docx" => "Word",
        "md" => "Markdown",
        "csv" => "CSV",
        _ => "AI 자동",
    };

    /// <summary>현재 프리셋/카테고리에 맞는 에이전트 이름, 심볼, 색상을 반환합니다.</summary>
    private (string Name, string Symbol, string Color) GetAgentIdentity()
    {
        string? category = null;
        lock (_convLock)
        {
            category = _currentConversation?.Category;
        }

        return category switch
        {
            // Cowork 프리셋 카테고리
            "보고서" => ("보고서 에이전트", "◆", "#3B82F6"),
            "데이터" => ("데이터 분석 에이전트", "◆", "#10B981"),
            "문서" => ("문서 작성 에이전트", "◆", "#6366F1"),
            "논문" => ("논문 분석 에이전트", "◆", "#6366F1"),
            "파일" => ("파일 관리 에이전트", "◆", "#8B5CF6"),
            "자동화" => ("자동화 에이전트", "◆", "#EF4444"),
            // Code 프리셋 카테고리
            "코드개발" => ("코드 개발 에이전트", "◆", "#3B82F6"),
            "리팩터링" => ("리팩터링 에이전트", "◆", "#6366F1"),
            "코드리뷰" => ("코드 리뷰 에이전트", "◆", "#10B981"),
            "보안점검" => ("보안 점검 에이전트", "◆", "#EF4444"),
            "테스트" => ("테스트 에이전트", "◆", "#F59E0B"),
            // Chat 카테고리
            "연구개발" => ("연구개발 에이전트", "◆", "#0EA5E9"),
            "시스템" => ("시스템 에이전트", "◆", "#64748B"),
            "수율분석" => ("수율분석 에이전트", "◆", "#F59E0B"),
            "제품분석" => ("제품분석 에이전트", "◆", "#EC4899"),
            "경영" => ("경영 분석 에이전트", "◆", "#8B5CF6"),
            "인사" => ("인사 관리 에이전트", "◆", "#14B8A6"),
            "제조기술" => ("제조기술 에이전트", "◆", "#F97316"),
            "재무" => ("재무 분석 에이전트", "◆", "#6366F1"),
            _ when _activeTab == "Code" => ("코드 에이전트", "◆", "#3B82F6"),
            _ when _activeTab == "Cowork" => ("코워크 에이전트", "◆", "#4B5EFC"),
            _ => ("AX 에이전트", "◆", "#4B5EFC"),
        };
    }
}
