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

namespace AxCopilot.Views;

public partial class HelpDetailWindow : Window
{
    private const string CatAll     = "전체";
    private const string CatPopular = "\u2B50 인기";

    // ─── 상단 3탭 메뉴 ──────────────────────────────────────────────────────
    private enum TopMenu { Overview, Shortcuts, Prefixes }

    private static readonly (TopMenu Key, string Label, string Icon)[] TopMenus =
    {
        (TopMenu.Overview,  "개요",       "\uE946"),
        (TopMenu.Shortcuts, "단축키 현황", "\uE765"),
        (TopMenu.Prefixes,  "예약어 현황", "\uE8F4"),
    };

    private TopMenu _currentTopMenu = TopMenu.Overview;

    // ─── 데이터 ──────────────────────────────────────────────────────────────
    private readonly List<HelpItemModel> _allItems;
    private readonly List<HelpItemModel> _shortcutItems;
    private readonly List<HelpItemModel> _prefixItems;
    private readonly List<HelpItemModel> _overviewItems;
    private readonly string _globalHotkey;

    private List<string> _categories = new();
    private int _currentPage;

    public HelpDetailWindow(IEnumerable<HelpItemModel> items, int totalCount,
                            string globalHotkey = "Alt+Space")
    {
        InitializeComponent();

        _allItems = items.ToList();
        _globalHotkey = globalHotkey;

        // ── 개요 항목 (전체 / 개요 / AI / 업무 보조) ───────────────────────
        _overviewItems = new List<HelpItemModel>
        {
            // ── 개요 ────────────────────────────────────────────────────
            new()
            {
                Category = "개요", Command = "AX Commander",
                Title = "키보드 하나로 모든 업무를 제어하는 AX Commander",
                Description = "단축키 한 번으로 앱 실행, 파일/폴더 검색, 계산, 클립보드 관리, 화면 캡처, 창 전환, 시스템 제어, 업무 일지, 루틴 자동화, AI 대화까지. 40개+ 명령어를 예약어로 즉시 접근.",
                Symbol = "\uE946",
                ColorBrush = ParseColor("#4B5EFC")
            },
            new()
            {
                Category = "개요", Command = "사용법",
                Title = "예약어 + 키워드 → Enter",
                Description = "특수 문자를 맨 앞에 입력하면 해당 기능 모드로 전환됩니다. 예) = 수식, # 클립보드, ? 웹검색, ! AI 대화, cap 캡처. 예약어 없이 입력하면 앱/파일/폴더 검색.",
                Symbol = "\uE765",
                ColorBrush = ParseColor("#0078D4")
            },
            new()
            {
                Category = "개요", Command = "데이터 보호",
                Title = "모든 데이터는 내 PC에만 안전하게 저장",
                Description = "설정, 클립보드, 대화 내역, 통계, 로그 등 모든 데이터가 로컬에 암호화 저장됩니다. 다른 PC에서는 열 수 없으며, 보존 기간 만료 시 자동 삭제됩니다.",
                Symbol = "\uE8B7",
                ColorBrush = ParseColor("#107C10")
            },

            // ── AI ──────────────────────────────────────────────────────
            new()
            {
                Category = "AI", Command = "! (AX Agent)",
                Title = "AX Agent — AI 어시스턴트와 대화",
                Description = "AX Commander에서 ! 를 입력하면 AI 대화가 열립니다. 질문을 바로 물어보거나, 이전 대화를 이어갈 수 있습니다. 대화 주제별 분류, 검색, 사이드바 토글을 지원합니다.",
                Example = "! 오늘 회의 요약해줘\n! 이메일 초안 작성해줘",
                Symbol = "\uE8BD",
                ColorBrush = ParseColor("#8B2FC9")
            },
            new()
            {
                Category = "AI", Command = "3탭 구조",
                Title = "Chat · Cowork · Code — 용도별 3탭 구조",
                Description = "Chat: 자유로운 AI 대화 — 질문, 번역, 요약, 아이디어 브레인스토밍.\n" +
                    "Cowork: 업무 보조 — 파일 읽기/쓰기, 문서 생성(Excel·Word·PPT·HTML), 데이터 분석, 보고서 작성.\n" +
                    "Code: 코딩 도우미 — 개발, 리팩터링, 코드 리뷰, 보안 점검, 테스트 작성. 개발 환경 자동 감지.",
                Symbol = "\uE71B",
                ColorBrush = ParseColor("#3B82F6")
            },
            new()
            {
                Category = "AI", Command = "AI 서비스",
                Title = "사내 AI · 외부 AI 서비스 선택 가능",
                Description = "관리자가 설정한 AI 서비스에 자동 연결됩니다. 사내 서버와 외부 서비스 중 선택할 수 있으며, 연결 정보는 암호화되어 보호됩니다.",
                Symbol = "\uE968",
                ColorBrush = ParseColor("#0078D4")
            },
            new()
            {
                Category = "AI", Command = "실시간 응답",
                Title = "AI 응답이 실시간으로 표시",
                Description = "AI의 응답이 생성되는 즉시 화면에 표시됩니다. 긴 답변도 기다리지 않고 바로 읽기 시작할 수 있습니다.",
                Symbol = "\uE8AB",
                ColorBrush = ParseColor("#107C10")
            },
            new()
            {
                Category = "AI", Command = "대화 보호",
                Title = "모든 대화 내역이 암호화 저장",
                Description = "대화 내역은 내 PC에서만 열람할 수 있도록 암호화됩니다. 다른 PC로 복사해도 열 수 없으며, 보존 기간 만료 시 자동 삭제됩니다.",
                Symbol = "\uE72E",
                ColorBrush = ParseColor("#C50F1F")
            },
            new()
            {
                Category = "AI", Command = "AI 규칙 설정",
                Title = "관리자가 설정한 응답 규칙이 자동 적용",
                Description = "관리자가 지정한 역할, 응답 톤, 업무 규칙이 모든 대화에 자동 적용됩니다. AI의 응답 스타일을 일괄 관리할 수 있습니다.",
                Symbol = "\uE771",
                ColorBrush = ParseColor("#D97706")
            },
            new()
            {
                Category = "AI", Command = "대화 관리",
                Title = "분류 · 검색 · 타임라인",
                Description = "대화를 주제별로 분류하고, 오늘/이전 타임라인으로 구분합니다. 검색과 카테고리 필터로 빠르게 찾을 수 있습니다.",
                Symbol = "\uE8F1",
                ColorBrush = ParseColor("#4B5EFC")
            },

            // ── 런처 탐색 ───────────────────────────────────────────────
            new()
            {
                Category = "런처 탐색", Command = "C:\\ · D:\\ · ~\\",
                Title = "인라인 파일 탐색기",
                Description = "드라이브 경로(C:\\, D:\\)나 홈 경로(~\\)를 입력하면 런처 안에서 바로 파일 탐색기가 열립니다. → 키로 하위 폴더 진입, ← 키로 상위 폴더 이동, Enter로 파일 실행 또는 탐색기 열기.",
                Example = "C:\\\nD:\\프로젝트\\",
                Symbol = "\uEC50",
                ColorBrush = ParseColor("#0078D4")
            },
            new()
            {
                Category = "런처 탐색", Command = "F3",
                Title = "파일 빠른 미리보기 (QuickLook)",
                Description = "파일을 선택한 상태에서 F3을 누르면 미리보기 창이 열립니다. 이미지·텍스트·PDF(텍스트 추출)·Word·Excel·코드 파일(줄 번호 + 언어별 색상)을 지원합니다. 다시 F3을 누르면 닫힙니다.",
                Example = "파일 선택 후 F3",
                Symbol = "\uE8A4",
                ColorBrush = ParseColor("#6B2C91")
            },
            new()
            {
                Category = "런처 탐색", Command = "F4",
                Title = "화면 영역 텍스트 추출 (OCR)",
                Description = "F4를 누르면 런처가 닫히고 화면 드래그 선택 모드가 즉시 실행됩니다. 원하는 영역을 드래그해 선택하면 내부 텍스트를 자동으로 인식해 클립보드에 복사하고 런처 입력창에 채웁니다. 'ocr' 예약어로도 실행할 수 있으며 클립보드 이미지도 지원합니다.",
                Example = "F4  또는  ocr → Enter",
                Symbol = "\uE8D2",
                ColorBrush = ParseColor("#0F766E")
            },
            new()
            {
                Category = "런처 탐색", Command = "↑ / ↓ (입력 없을 때)",
                Title = "검색 히스토리 탐색",
                Description = "입력창이 비어있거나 검색 결과가 없을 때 ↑/↓ 키를 누르면 이전에 입력했던 검색어를 불러옵니다. 최대 50개 기록이 앱 재시작 후에도 유지됩니다.",
                Example = "입력 없는 상태에서 ↑ 키",
                Symbol = "\uE74A",
                ColorBrush = ParseColor("#0078D4")
            },
            new()
            {
                Category = "런처 탐색", Command = "ext: · size: · modified: · type: · in:",
                Title = "고급 검색 필터 문법",
                Description = "검색어 뒤에 필터를 추가하면 결과를 세밀하게 좁힐 수 있습니다.\n• ext:.pdf,.docx — 확장자 필터\n• size:>10mb / size:<500kb — 파일 크기\n• modified:today / week / month — 수정 날짜\n• type:file / folder / app — 항목 유형\n• in:Documents — 경로에 포함된 텍스트",
                Example = "보고서 ext:.pdf size:>1mb\nmodified:week ext:.cs",
                Symbol = "\uE16E",
                ColorBrush = ParseColor("#059669")
            },
            new()
            {
                Category = "런처 탐색", Command = "= 20km · = 100°F · = today+30d",
                Title = "단위 변환 자동 제안 · 날짜 계산",
                Description = "= 뒤에 숫자+단위를 입력하면 주요 단위로 자동 변환 제안을 보여줍니다. 온도(°C/°F/K), 길이(km/miles/ft), 무게(kg/lb), 속도, 데이터 크기 지원. today+30d / today-2w 로 날짜 계산도 가능합니다.",
                Example = "= 20km\n= 100°F\n= today+14d",
                Symbol = "\uE8EF",
                ColorBrush = ParseColor("#D97706")
            },

            // ── 업무 보조 ───────────────────────────────────────────────
            new()
            {
                Category = "업무 보조", Command = "note",
                Title = "빠른 메모 저장 · 검색",
                Description = "note 뒤에 내용을 입력하면 즉시 메모가 저장됩니다. 나중에 note 키워드로 검색하면 이전 메모를 다시 찾을 수 있습니다. 간단한 아이디어나 할 일을 빠르게 기록하세요.",
                Example = "note 내일 보고서 마감\nnote 김부장님 연락처 확인",
                Symbol = "\uE70B",
                ColorBrush = ParseColor("#D97706")
            },
            new()
            {
                Category = "업무 보조", Command = "journal",
                Title = "업무 일지 작성",
                Description = "journal 뒤에 내용을 입력하면 날짜별 업무 일지로 자동 기록됩니다. 하루 동안의 업무 내용을 간결하게 쌓아가면 주간 보고나 회고에 활용할 수 있습니다.",
                Example = "journal 배포 완료\njournal 클라이언트 미팅 30분",
                Symbol = "\uE8F2",
                ColorBrush = ParseColor("#0078D4")
            },
            new()
            {
                Category = "업무 보조", Command = "pipe",
                Title = "클립보드 텍스트 파이프라인 변환",
                Description = "클립보드에 복사된 텍스트를 여러 변환 함수로 한 번에 처리합니다. upper(대문자), lower(소문자), trim(공백 제거), wrap(줄바꿈), sort(정렬) 등을 연결할 수 있습니다.",
                Example = "pipe upper | trim | wrap 80",
                Symbol = "\uE8AB",
                ColorBrush = ParseColor("#107C10")
            },
            new()
            {
                Category = "업무 보조", Command = "diff",
                Title = "두 텍스트 비교 (Diff)",
                Description = "클립보드의 두 텍스트를 비교하여 차이점을 한눈에 보여줍니다. 코드 변경 사항 확인, 문서 버전 비교 등에 유용합니다.",
                Example = "diff",
                Symbol = "\uE8FD",
                ColorBrush = ParseColor("#6B2C91")
            },
            new()
            {
                Category = "업무 보조", Command = "encode",
                Title = "인코딩 · 디코딩 변환",
                Description = "Base64, URL, HTML, Unicode 등 다양한 형식으로 텍스트를 인코딩하거나 디코딩합니다. 개발자에게 특히 유용한 변환 도구입니다.",
                Example = "encode base64 hello\nencode url 한글 테스트",
                Symbol = "\uE943",
                ColorBrush = ParseColor("#323130")
            },
            new()
            {
                Category = "업무 보조", Command = "routine",
                Title = "반복 작업 루틴 자동화",
                Description = "자주 하는 작업 묶음을 루틴으로 등록해 두면 한 번의 명령으로 여러 앱을 동시에 열거나 작업 환경을 구성할 수 있습니다. 출근·퇴근 루틴 등을 만들어 보세요.",
                Example = "routine start 출근\nroutine list",
                Symbol = "\uE8F5",
                ColorBrush = ParseColor("#BE185D")
            },
            new()
            {
                Category = "업무 보조", Command = "stats",
                Title = "텍스트 통계 (글자수·단어수·줄수)",
                Description = "클립보드에 복사된 텍스트의 글자 수, 단어 수, 줄 수를 즉시 계산합니다. 보고서 분량 체크, SNS 글자 수 제한 확인 등에 활용하세요.",
                Example = "stats",
                Symbol = "\uE9D9",
                ColorBrush = ParseColor("#44546A")
            },
            new()
            {
                Category = "업무 보조", Command = "json",
                Title = "JSON 파싱 · 정리 · 미리보기",
                Description = "클립보드에 복사된 JSON을 자동으로 파싱하고 읽기 좋은 형태로 정리합니다. 들여쓰기, 키 하이라이트, 복사 기능을 제공합니다.",
                Example = "json {\"key\":\"value\"}",
                Symbol = "\uE8A5",
                ColorBrush = ParseColor("#4B5EFC")
            },
        };

        // ── 단축키 항목 생성 ─────────────────────────────────────────────────
        _shortcutItems = BuildShortcutItems(_globalHotkey);

        // ── 예약어 항목 분류 ────────────────────────────────────────────────
        _prefixItems = _allItems.ToList();

        SubtitleText.Text = $"총 {totalCount}개 명령어 · 단축키 {_shortcutItems.Count}개 · 예약어 {_prefixItems.Count}개";

        BuildTopMenu();
        SwitchTopMenu(TopMenu.Overview);

        KeyDown += OnKeyDown;
    }

    // ─── 정적 헬퍼 ───────────────────────────────────────────────────────────

    private static SolidColorBrush ParseColor(string hex)
    {
        try { return ThemeResourceHelper.HexBrush(hex); }
        catch (Exception) { return new SolidColorBrush(Colors.Gray); }
    }

    private static HelpItemModel MakeShortcut(string cat, string key, string title, string desc, string symbol, string color)
    {
        return new HelpItemModel
        {
            Category = cat,
            Command = key,
            Title = title,
            Description = desc,
            Symbol = symbol,
            ColorBrush = ThemeResourceHelper.HexBrush(color)
        };
    }
}

public class HelpItemModel
{
    public string Category    { get; init; } = "";
    public string Command     { get; init; } = "";
    public string Title       { get; init; } = "";
    public string Description { get; init; } = "";
    public string Example     { get; init; } = "";
    public string Symbol      { get; init; } = "";
    public SolidColorBrush ColorBrush { get; init; } = new(Colors.Gray);
    public bool HasExample => !string.IsNullOrEmpty(Example);
}
