using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using AxCopilot.Services;
using AxCopilot.ViewModels;

namespace AxCopilot.Views;

public partial class SettingsWindow
{
    // ─── 도구/커넥터 관리 UI (기타 탭) ─────────────────────────────────────────────

    private void BuildToolRegistryPanel()
    {
        if (AgentEtcContent == null) return;

        // 도구 목록 데이터 (카테고리별)
        var toolGroups = new (string Category, string Icon, string IconColor, (string Name, string Desc)[] Tools)[]
        {
            ("파일/검색", "\uE8B7", "#F59E0B", new[]
            {
                ("file_read",       "파일 읽기 — 텍스트/바이너리 파일의 내용을 읽습니다"),
                ("file_write",      "파일 쓰기 — 새 파일을 생성하거나 기존 파일을 덮어씁니다"),
                ("file_edit",       "파일 편집 — 줄 번호 기반으로 파일의 특정 부분을 수정합니다"),
                ("glob",            "파일 패턴 검색 — 글로브 패턴으로 파일을 찾습니다 (예: **/*.cs)"),
                ("grep_tool",       "텍스트 검색 — 정규식으로 파일 내용을 검색합니다"),
                ("folder_map",      "폴더 구조 — 프로젝트의 디렉토리 트리를 조회합니다"),
                ("document_read",   "문서 읽기 — PDF, DOCX 등 문서 파일의 텍스트를 추출합니다"),
            }),
            ("프로세스/빌드", "\uE756", "#06B6D4", new[]
            {
                ("process",         "프로세스 실행 — 외부 명령/프로그램을 실행합니다"),
                ("build_run",       "빌드/테스트 — 프로젝트 타입을 감지하여 빌드/테스트를 실행합니다"),
                ("dev_env_detect",  "개발 환경 감지 — IDE, 런타임, 빌드 도구를 자동으로 인식합니다"),
            }),
            ("코드 분석", "\uE943", "#818CF8", new[]
            {
                ("search_codebase", "코드 키워드 검색 — TF-IDF 기반으로 관련 코드를 찾습니다"),
                ("code_review",     "AI 코드 리뷰 — Git diff 분석, 파일 정적 검사, PR 요약"),
                ("lsp",             "LSP 인텔리전스 — 정의 이동, 참조 검색, 심볼 목록 (C#/TS/Python)"),
                ("test_loop",       "테스트 루프 — 테스트 생성/실행/분석 자동화"),
                ("git_tool",        "Git 작업 — status, log, diff, commit 등 Git 명령 실행"),
                ("snippet_runner",  "코드 실행 — C#/Python/JavaScript 스니펫 즉시 실행"),
            }),
            ("문서 생성", "\uE8A5", "#34D399", new[]
            {
                ("excel_create",    "Excel 생성 — .xlsx 스프레드시트를 생성합니다"),
                ("docx_create",     "Word 생성 — .docx 문서를 생성합니다"),
                ("csv_create",      "CSV 생성 — CSV 파일을 생성합니다"),
                ("markdown_create", "마크다운 생성 — .md 파일을 생성합니다"),
                ("html_create",     "HTML 생성 — HTML 파일을 생성합니다"),
                ("chart_create",    "차트 생성 — 데이터 시각화 차트를 생성합니다"),
                ("batch_create",    "배치 생성 — 스크립트 파일을 생성합니다"),
                ("document_review", "문서 검증 — 문서 품질을 검사합니다"),
                ("format_convert",  "포맷 변환 — 문서 형식을 변환합니다"),
            }),
            ("데이터 처리", "\uE9F5", "#F59E0B", new[]
            {
                ("json_tool",       "JSON 처리 — JSON 파싱, 변환, 검증, 포맷팅"),
                ("regex_tool",      "정규식 — 정규식 테스트, 추출, 치환"),
                ("diff_tool",       "텍스트 비교 — 두 파일/텍스트 비교, 통합 diff 출력"),
                ("base64_tool",     "인코딩 — Base64/URL 인코딩, 디코딩"),
                ("hash_tool",       "해시 계산 — MD5/SHA256 해시 계산 (파일/텍스트)"),
                ("datetime_tool",   "날짜/시간 — 날짜 변환, 타임존, 기간 계산"),
            }),
            ("시스템/환경", "\uE770", "#06B6D4", new[]
            {
                ("clipboard_tool",  "클립보드 — Windows 클립보드 읽기/쓰기 (텍스트/이미지)"),
                ("notify_tool",     "알림 — Windows 시스템 알림 전송"),
                ("env_tool",        "환경변수 — 환경변수 읽기/설정 (프로세스 범위)"),
                ("zip_tool",        "압축 — 파일 압축(zip) / 해제"),
                ("http_tool",       "HTTP — 로컬/사내 HTTP API 호출 (GET/POST)"),
                ("sql_tool",        "SQLite — SQLite DB 쿼리 실행 (로컬 파일)"),
            }),
            ("에이전트", "\uE99A", "#F472B6", new[]
            {
                ("spawn_agent",     "서브에이전트 — 하위 작업을 병렬로 실행하는 서브에이전트를 생성합니다"),
                ("wait_agents",     "에이전트 대기 — 실행 중인 서브에이전트의 결과를 수집합니다"),
                ("memory",          "에이전트 메모리 — 프로젝트 규칙, 선호도를 저장/검색합니다"),
                ("skill_manager",   "스킬 관리 — 스킬 목록 조회, 상세 정보, 재로드"),
                ("project_rules",   "프로젝트 지침 — AX.md 개발 지침을 읽고 씁니다"),
            }),
        };

        // 도구 목록을 섹션으로 그룹화
        var toolCards = new List<UIElement>();

        // 설명
        // 도구 헤더
        toolCards.Add(new TextBlock
        {
            Text = $"등록된 도구/커넥터 ({toolGroups.Sum(g => g.Tools.Length)})",
            FontSize = 13,
            FontWeight = FontWeights.SemiBold,
            Foreground = TryFindResource("PrimaryText") as Brush ?? Brushes.White,
            Margin = new Thickness(2, 4, 0, 4),
        });
        toolCards.Add(new TextBlock
        {
            Text = "에이전트가 사용할 수 있는 도구 목록입니다. 코워크/코드 탭에서 LLM이 자동으로 호출합니다.",
            FontSize = 11,
            Foreground = TryFindResource("SecondaryText") as Brush
                         ?? ThemeResourceHelper.HexBrush("#9999BB"),
            Margin = new Thickness(2, 0, 0, 10),
            TextWrapping = TextWrapping.Wrap,
        });

        foreach (var group in toolGroups)
        {
            // 카테고리 카드
            var card = new Border
            {
                Background = TryFindResource("ItemBackground") as Brush ?? Brushes.White,
                CornerRadius = new CornerRadius(10),
                Padding = new Thickness(14, 10, 14, 10),
                Margin = new Thickness(0, 0, 0, 6),
            };

            var cardPanel = new StackPanel();

            // 도구 아이템 패널 (접기/열기 대상)
            var toolItemsPanel = new StackPanel { Visibility = Visibility.Collapsed };

            // 접기/열기 화살표
            var arrow = new TextBlock
            {
                Text = "\uE70D",
                FontFamily = ThemeResourceHelper.SegoeMdl2,
                FontSize = 9,
                Foreground = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray,
                VerticalAlignment = VerticalAlignment.Center,
                Margin = new Thickness(0, 0, 6, 0),
                RenderTransformOrigin = new Point(0.5, 0.5),
                RenderTransform = new RotateTransform(0),
            };

            // 카테고리 헤더 (클릭 가능)
            var catHeader = new Border
            {
                Background = Brushes.Transparent,
                Cursor = Cursors.Hand,
            };
            var catHeaderPanel = new StackPanel { Orientation = Orientation.Horizontal };
            catHeaderPanel.Children.Add(arrow);
            catHeaderPanel.Children.Add(new TextBlock
            {
                Text = group.Icon,
                FontFamily = ThemeResourceHelper.SegoeMdl2,
                FontSize = 14,
                Foreground = ThemeResourceHelper.HexBrush(group.IconColor),
                VerticalAlignment = VerticalAlignment.Center,
                Margin = new Thickness(0, 0, 8, 0),
            });
            var catTitle = new TextBlock
            {
                Text = $"{group.Category}  ({group.Tools.Length})",
                FontSize = 12.5,
                FontWeight = FontWeights.SemiBold,
                Foreground = TryFindResource("PrimaryText") as Brush
                             ?? ThemeResourceHelper.HexBrush("#1A1B2E"),
                VerticalAlignment = VerticalAlignment.Center,
            };
            catHeaderPanel.Children.Add(catTitle);
            catHeader.Child = catHeaderPanel;

            // 클릭 시 접기/열기 토글
            catHeader.MouseLeftButtonDown += (s, e) =>
            {
                e.Handled = true;
                bool isVisible = toolItemsPanel.Visibility == Visibility.Visible;
                toolItemsPanel.Visibility = isVisible ? Visibility.Collapsed : Visibility.Visible;
                arrow.RenderTransform = new RotateTransform(isVisible ? 0 : 90);
            };

            cardPanel.Children.Add(catHeader);

            // 구분선
            toolItemsPanel.Children.Add(new Border
            {
                Height = 1,
                Background = TryFindResource("BorderColor") as Brush
                             ?? ThemeResourceHelper.HexBrush("#F0F0F4"),
                Margin = new Thickness(0, 6, 0, 4),
            });

            // 도구 아이템
            foreach (var (name, toolDesc) in group.Tools)
            {
                var row = new Grid { Margin = new Thickness(0, 3, 0, 3) };
                row.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Auto) });
                row.ColumnDefinitions.Add(new ColumnDefinition());

                var nameBlock = new TextBlock
                {
                    Text = name,
                    FontSize = 12,
                    FontFamily = ThemeResourceHelper.ConsolasCode,
                    Foreground = TryFindResource("AccentColor") as Brush
                                 ?? ThemeResourceHelper.HexBrush("#4B5EFC"),
                    VerticalAlignment = VerticalAlignment.Center,
                    MinWidth = 130,
                    Margin = new Thickness(4, 0, 12, 0),
                };
                Grid.SetColumn(nameBlock, 0);
                row.Children.Add(nameBlock);

                var descBlock = new TextBlock
                {
                    Text = toolDesc,
                    FontSize = 11.5,
                    Foreground = TryFindResource("SecondaryText") as Brush
                                 ?? ThemeResourceHelper.HexBrush("#6666AA"),
                    VerticalAlignment = VerticalAlignment.Center,
                    TextWrapping = TextWrapping.Wrap,
                };
                Grid.SetColumn(descBlock, 1);
                row.Children.Add(descBlock);

                toolItemsPanel.Children.Add(row);
            }

            cardPanel.Children.Add(toolItemsPanel);
            card.Child = cardPanel;
            toolCards.Add(card);
        }

        // ── 도구 목록을 직접 추가 (카테고리별 접기/열기) ──
        foreach (var card in toolCards)
            AgentEtcContent.Children.Insert(AgentEtcContent.Children.Count, card);

        int insertIdx = AgentEtcContent.Children.Count;

        // ── 로드된 스킬 목록 ──
        BuildSkillListSection(ref insertIdx);
    }

}
