using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media;
using System.Windows.Threading;
using AxCopilot.SDK;
using AxCopilot.Services;
using AxCopilot.Views;

namespace AxCopilot.Handlers;

public class HelpHandler : IActionHandler
{
	private record HelpEntry(string Category, string Command, string Title, string Description, string Example, string Symbol, string ColorHex);

	private readonly SettingsService? _settings;

	private static readonly HelpEntry[] _baseEntries = new HelpEntry[47]
	{
		new HelpEntry("검색", "", "앱 · 파일 · 북마크 퍼지 검색", "앱 이름, 파일명, 한국어 초성, Chrome·Edge 북마크를 통합 검색", "chrome  /  보고서  /  ㅅㄷ (설정)  /  북마크 제목", "\ue721", "#0078D4"),
		new HelpEntry("계산", "=", "계산기", "수식 계산 · 단위 변환 · 실시간 환율", "= sqrt(144)  /  = 100 USD to KRW  /  = 15km to miles", "\ue8ef", "#4B5EFC"),
		new HelpEntry("검색", "?", "웹 검색 (10개 엔진)", "?n 네이버 · ?g 구글 · ?y 유튜브 · ?gh 깃허브 · ?d DuckDuckGo · ?w 위키피디아 · ?nw 나무위키 · ?nm 네이버지도 · ?ni 네이버이미지 · ?gi 구글이미지", "? 오늘 날씨  /  ?n 뉴스  /  ?g python  /  ?nw 검색어  /  ?y 음악  /  ?gh axios", "\ue774", "#006EAF"),
		new HelpEntry("클립보드", "#", "클립보드 히스토리", "복사 이력 검색 & 재사용 · Shift+↑↓로 여러 항목 병합", "#  /  # 회의록  /  (Shift+↑↓ 선택 후 Shift+Enter 병합)", "\ue81c", "#B7791F"),
		new HelpEntry("클립보드", "$", "클립보드 텍스트 변환 (12종)", "현재 클립보드 내용을 즉시 변환", "$json  /  $b64e  /  $upper  /  $url  /  $md5  /  $trim", "\ue77f", "#8764B8"),
		new HelpEntry("텍스트", ";", "텍스트 스니펫", "저장된 템플릿 불러오기 · 변수 치환 지원", ";addr  /  ;sig  /  ;greet", "\ue70b", "#0F6CBD"),
		new HelpEntry("단축키", "@", "URL 단축키", "저장해둔 URL을 키워드로 바로 열기", "@gh  /  @notion  /  @jira", "\ue774", "#0078D4"),
		new HelpEntry("단축키", "cd", "폴더 단축키", "저장해둔 폴더를 키워드로 바로 열기", "cd dl  /  cd work  /  cd desktop", "\ue8b7", "#107C10"),
		new HelpEntry("단축키", ">", "터미널 명령 실행", "PowerShell 명령을 AX Commander에서 직접 실행", "> git status  /  > ipconfig  /  > cls", "\ue756", "#323130"),
		new HelpEntry("창관리", "~", "워크스페이스 저장·복원", "현재 창 배치를 스냅샷으로 저장하고 언제든 복원", "~save 업무  /  ~restore 업무  /  ~list", "\ue8a1", "#C50F1F"),
		new HelpEntry("창관리", "snap", "창 분할 레이아웃", "창을 화면의 특정 영역에 즉시 스냅", "snap left  /  snap right  /  snap tl  /  snap full", "\ue8a0", "#B45309"),
		new HelpEntry("창관리", "cap", "스크린샷 캡처 (예약어 변경 가능)", "영역 선택 · 활성 창 · 스크롤 · 전체 화면. Shift+Enter로 지연 캡처(3/5/10초 타이머). 결과는 클립보드에 복사. 글로벌 단축키(PrintScreen 등)로 바로 캡처 가능. 설정 → 캡처 탭에서 예약어·단축키·스크롤 속도 변경", "cap region  /  cap window  /  cap scroll  /  cap screen  /  Shift+Enter → 지연 캡처", "\ue722", "#BE185D"),
		new HelpEntry("시스템", "/", "시스템 명령", "잠금·절전·재시작·종료·타이머·알람", "/lock  /  /sleep  /  /shutdown  /  /timer 5m  /  /alarm 14:30", "\ue7e8", "#4A4A4A"),
		new HelpEntry("시스템", "info · *", "시스템 정보", "IP · 배터리 · 볼륨 · 가동시간 · CPU · 디스크. `*` 입력으로도 동일하게 사용 가능", "info  /  info ip  /  info battery  /  *  /  * ip", "\ue7f4", "#5B4E7E"),
		new HelpEntry("알림", "", "잠금 해제 사용시간 알림", "PC 잠금 해제 시 오늘 누적 사용 시간과 격려 문구·명언 팝업 표시. 설정 → 알림 탭에서 활성화", "설정 → 알림 탭: 활성화 토글 / 표시 위치(4방향) / 표시 간격(30분~4시간) / 자동 닫힘(5초~3분)", "\uea8f", "#EA8F00"),
		new HelpEntry("시스템", "kill", "프로세스 종료", "프로세스 이름으로 검색 후 강제 종료", "kill chrome  /  kill node  /  kill teams", "\uea39", "#CC2222"),
		new HelpEntry("시스템", "media", "미디어 제어", "재생·일시정지·이전·다음·볼륨 조절", "media play  /  media next  /  media vol+  /  media mute", "\ue768", "#1A6B3C"),
		new HelpEntry("개발", "json", "JSON 포맷 · 검증", "클립보드의 JSON을 정렬·압축·유효성 검사", "json  →  format / minify / validate", "\ue930", "#D97706"),
		new HelpEntry("개발", "encode", "인코딩 · 해싱", "Base64 · URL · HTML · UTF-8 · MD5 · SHA256", "encode base64  /  encode url  /  encode sha256", "\ue8cb", "#6366F1"),
		new HelpEntry("개발", "color", "색상 변환", "HEX ↔ RGB ↔ HSL ↔ HSV 변환 및 색상명 지원", "color #FF5733  /  color 255,87,51  /  color red", "\ue771", "#EC4899"),
		new HelpEntry("개발", "port", "포트 · 프로세스 조회", "포트 번호로 점유 프로세스 확인", "port 3000  /  port 8080  /  port 443", "\ue968", "#006699"),
		new HelpEntry("개발", "env", "환경변수 조회", "시스템 환경변수 검색 및 클립보드 복사", "env  /  env PATH  /  env JAVA", "\ue8d7", "#0D9488"),
		new HelpEntry("앱", "emoji", "이모지 피커", "300개+ 이모지 검색 · Enter로 클립보드 복사", "emoji  /  emoji 하트  /  emoji wave  /  emoji 불꽃", "\ue76e", "#F59E0B"),
		new HelpEntry("앱", "recent", "최근 파일", "Windows 최근 파일 목록 검색 & 바로 열기", "recent  /  recent 보고서  /  recent xlsx", "\ue81c", "#059669"),
		new HelpEntry("앱", "note", "빠른 메모", "간단한 메모를 저장하고 불러오기", "note 내일 회의 10시  /  note", "\ue70b", "#7C3AED"),
		new HelpEntry("앱", "uninstall", "앱 제거", "설치된 앱 검색 후 제거", "uninstall  /  uninstall kakao  /  uninstall zoom", "\ue74d", "#DC2626"),
		new HelpEntry("유틸", "pick", "스포이드 색상 추출", "화면 아무 곳을 클릭하여 HEX 색상 코드 추출 · 돋보기로 실시간 미리보기 · 결과 반투명 창 5초 표시", "pick  →  스포이드 모드 진입  →  클릭으로 색상 추출", "\ue771", "#EC4899"),
		new HelpEntry("유틸", "date", "날짜 계산 · D-day · 타임스탬프", "날짜 가감(+30d), D-day 계산, Unix ↔ 날짜 변환, 요일·ISO 주차 조회", "date  /  date +30d  /  date 2026-12-25  /  date 1711584000  /  date unix", "\ue787", "#0EA5E9"),
		new HelpEntry("시스템", "svc", "서비스 관리", "Windows 서비스 검색·시작·중지·재시작 + AX 클립보드 서비스 강제 재시작", "svc  /  svc spooler  /  svc restart clipboard", "\ue912", "#6366F1"),
		new HelpEntry("유틸", "pipe", "클립보드 파이프라인", "변환을 > 로 체이닝: 대문자→공백제거→Base64 등 19종 필터 한 번에 적용", "pipe upper > trim > b64e  /  pipe sort > unique > number", "\ue8c8", "#8B5CF6"),
		new HelpEntry("유틸", "journal", "업무 일지 자동 생성", "오늘 사용한 앱·명령어·활성 시간을 마크다운 요약으로 자동 생성. 스탠드업/일일 보고에 바로 사용", "journal  /  journal 2026-03-25", "\ue70b", "#0EA5E9"),
		new HelpEntry("유틸", "routine", "루틴 자동화", "등록된 루틴(앱·폴더·URL 조합)을 한 번에 순서대로 실행. 출근/퇴근/회의 전 세팅", "routine  /  routine morning  /  routine endofday", "\ue82f", "#F59E0B"),
		new HelpEntry("유틸", "batch", "텍스트 일괄 처리", "클립보드 각 줄에 동시 적용: 접두사·접미사·줄번호·정렬·중복제거·따옴표·치환·CSV 변환", "batch number  /  batch prefix >>  /  batch sort  /  batch replace A B", "\ue8c6", "#10B981"),
		new HelpEntry("유틸", "diff", "텍스트/파일 비교", "클립보드 최근 2개 텍스트 또는 파일 2개를 줄 단위 비교. 추가·삭제·동일 줄 하이라이트", "diff  /  diff C:\\a.txt C:\\b.txt", "\ue89a", "#EF4444"),
		new HelpEntry("유틸", "win", "윈도우 포커스 스위처", "열린 창을 타이틀·프로세스명으로 검색하여 Alt+Tab 없이 즉시 전환", "win  /  win chrome  /  win 보고서", "\ue8a7", "#6366F1"),
		new HelpEntry("시스템", "^", "Windows 실행 명령", "Win+R 실행 창과 동일하게 명령어 실행. notepad, calc, cmd, control, mstsc 등 모든 Windows 실행 명령 지원", "^ notepad  /  ^ cmd  /  ^ calc  /  ^ control  /  ^ mspaint", "\ue7c4", "#E08850"),
		new HelpEntry("유틸", "stats", "텍스트 통계 분석", "클립보드 텍스트 글자·단어·줄 수, 키워드 빈도, 읽기 시간 추정", "stats  /  stats 키워드  (클립보드 텍스트 분석)", "\ue8d2", "#6366F1"),
		new HelpEntry("유틸", "fav", "즐겨찾기 (파일·폴더)", "자주 쓰는 경로를 등록하고 빠르게 열기", "fav  /  fav add 보고서 C:\\work\\report.xlsx  /  fav del 보고서", "\ue728", "#F59E0B"),
		new HelpEntry("유틸", "rename", "파일 일괄 이름변경", "폴더 내 파일을 패턴·변수로 일괄 이름변경. {n}순번 {date}날짜 {orig}원본명", "rename C:\\work\\*.xlsx 보고서_{n}", "\ue8ac", "#8B5CF6"),
		new HelpEntry("유틸", "monitor", "시스템 리소스 모니터", "CPU·메모리·디스크·프로세스 실시간 현황 조회", "monitor  /  monitor cpu  /  monitor mem  /  monitor disk", "\ue7f4", "#10B981"),
		new HelpEntry("유틸", "scaffold", "프로젝트 스캐폴딩", "내장/사용자 템플릿으로 프로젝트 폴더 구조 일괄 생성", "scaffold  /  scaffold webapi  /  scaffold C:\\new-project webapi", "\ue8f1", "#0EA5E9"),
		new HelpEntry("키보드", "Alt+Space", "AX Commander 열기 / 닫기", "어디서든 AX Commander를 토글", "설정 → 핫키에서 변경 가능", "\ue946", "#6B7280"),
		new HelpEntry("키보드", "Enter", "실행", "선택된 항목 실행", "", "\ue946", "#6B7280"),
		new HelpEntry("키보드", "Shift+Enter", "Large Type / 병합 실행 / 지연 캡처", "텍스트를 전체화면으로 표시 · 클립보드 항목 병합 · 캡처 모드에서는 지연 캡처(3초/5초/10초) 타이머 선택", "(#모드) Shift+↑↓ 선택 후 Shift+Enter 병합  /  (cap모드) Shift+Enter → 타이머 선택", "\ue946", "#6B7280"),
		new HelpEntry("키보드", "Tab", "자동완성", "선택 항목으로 입력 자동완성", "", "\ue946", "#6B7280"),
		new HelpEntry("키보드", "→  (커서 끝)", "파일 액션 메뉴", "앱·파일 선택 후 → 키: 경로복사 · 탐색기 · 관리자 · 터미널", "", "\ue946", "#6B7280"),
		new HelpEntry("키보드", "Ctrl+,", "설정 열기", "AX Copilot 설정 창", "", "\ue946", "#6B7280")
	};

	public string? Prefix => "help";

	public PluginMetadata Metadata => new PluginMetadata("Help", "AX Commander 사용 설명서", "1.0", "AX");

	public HelpHandler(SettingsService? settings = null)
	{
		_settings = settings;
	}

	private HelpEntry[] GetEntries()
	{
		string text = _settings?.Settings.ScreenCapture.Prefix ?? "cap";
		if (string.IsNullOrWhiteSpace(text))
		{
			text = "cap";
		}
		string command = _settings?.Settings.Hotkey ?? "Alt+Space";
		HelpEntry[] array = (HelpEntry[])_baseEntries.Clone();
		for (int i = 0; i < array.Length; i++)
		{
			if (array[i].Title == "스크린샷 캡처 (예약어 변경 가능)")
			{
				array[i] = array[i]with
				{
					Command = text,
					Example = $"{text} screen  /  {text} window  /  {text} region  /  {text} scroll  /  (설정 → 캡처 탭)"
				};
			}
			if (array[i].Title == "AX Commander 열기 / 닫기")
			{
				array[i] = array[i]with
				{
					Command = command,
					Example = "설정 → 핫키에서 변경 가능"
				};
			}
		}
		return array;
	}

	public Task<IEnumerable<LauncherItem>> GetItemsAsync(string query, CancellationToken ct)
	{
		string q = query.Trim();
		HelpEntry[] entries = GetEntries();
		if (string.IsNullOrEmpty(q))
		{
			int value = entries.Count((HelpEntry e) => e.Category != "키보드");
			int value2 = entries.Count((HelpEntry e) => e.Category == "키보드");
			return Task.FromResult((IEnumerable<LauncherItem>)new _003C_003Ez__ReadOnlySingleElementList<LauncherItem>(new LauncherItem("AX Commander — 전체 기능 목록 보기", $"총 {value}개 명령어 · {value2}개 단축키  ·  Enter → 기능 설명 창 열기", null, "__HELP_OVERVIEW__", null, "\ue946")));
		}
		IEnumerable<HelpEntry> source = entries.Where((HelpEntry e) => e.Category.Contains(q, StringComparison.OrdinalIgnoreCase) || e.Command.Contains(q, StringComparison.OrdinalIgnoreCase) || e.Title.Contains(q, StringComparison.OrdinalIgnoreCase) || e.Description.Contains(q, StringComparison.OrdinalIgnoreCase));
		List<LauncherItem> list = source.Select((HelpEntry e) => new LauncherItem(FormatTitle(e), FormatSubtitle(e), null, e.Example, null, e.Symbol)).ToList();
		if (list.Count == 0)
		{
			list.Add(new LauncherItem("'" + q + "'에 해당하는 명령어가 없습니다", "help만 입력하면 전체 기능 창을 열 수 있어요", null, null, null, "\ue946"));
		}
		return Task.FromResult((IEnumerable<LauncherItem>)list);
	}

	public Task ExecuteAsync(LauncherItem item, CancellationToken ct)
	{
		object data = item.Data;
		string s = data as string;
		if (s == null)
		{
			return Task.CompletedTask;
		}
		if (s == "__HELP_OVERVIEW__")
		{
			((DispatcherObject)Application.Current).Dispatcher.Invoke((Action)delegate
			{
				HelpEntry[] entries = GetEntries();
				IEnumerable<HelpItemModel> items = entries.Select((HelpEntry e) => new HelpItemModel
				{
					Category = e.Category,
					Command = (string.IsNullOrEmpty(e.Command) ? "(퍼지 검색)" : e.Command),
					Title = e.Title,
					Description = e.Description,
					Example = e.Example,
					Symbol = e.Symbol,
					ColorBrush = ParseColor(e.ColorHex)
				});
				string globalHotkey = _settings?.Settings.Hotkey ?? "Alt+Space";
				new HelpDetailWindow(items, entries.Count((HelpEntry e) => e.Category != "키보드"), globalHotkey).Show();
			});
			return Task.CompletedTask;
		}
		if (!string.IsNullOrWhiteSpace(s))
		{
			try
			{
				((DispatcherObject)Application.Current).Dispatcher.Invoke((Action)delegate
				{
					Clipboard.SetText(s);
				});
			}
			catch
			{
			}
		}
		return Task.CompletedTask;
	}

	private static SolidColorBrush ParseColor(string hex)
	{
		try
		{
			Color color = (Color)ColorConverter.ConvertFromString(hex);
			return new SolidColorBrush(color);
		}
		catch
		{
			return new SolidColorBrush(Colors.Gray);
		}
	}

	private static string FormatTitle(HelpEntry e)
	{
		string text = (string.IsNullOrEmpty(e.Command) ? ("[" + e.Category + "]") : ("[" + e.Category + "]  " + e.Command));
		return text + "  —  " + e.Title;
	}

	private static string FormatSubtitle(HelpEntry e)
	{
		List<string> list = new List<string> { e.Description };
		if (!string.IsNullOrEmpty(e.Example))
		{
			list.Add("예)  " + e.Example);
		}
		return string.Join("   ·   ", list);
	}
}
