namespace YMhut.Box.Core.Tools;

public sealed class ToolCatalog
{
    private readonly List<IToolModule> _modules;

    public ToolCatalog(IEnumerable<IToolModule>? modules = null)
    {
        var provided = modules?.ToList();
        _modules = provided is { Count: > 0 } ? provided : DefaultModules().ToList();
    }

    public IReadOnlyList<IToolModule> Modules => _modules;

    public IEnumerable<IToolModule> Search(string query, ToolCategory category = ToolCategory.All)
    {
        var normalized = query.Trim();
        var source = category == ToolCategory.All
            ? _modules
            : _modules.Where(module => module.Metadata.Category == category);

        if (string.IsNullOrWhiteSpace(normalized))
        {
            return source;
        }

        return source.Where(module =>
            module.Id.Contains(normalized, StringComparison.OrdinalIgnoreCase) ||
            module.Metadata.Name.Contains(normalized, StringComparison.OrdinalIgnoreCase) ||
            module.Metadata.Description.Contains(normalized, StringComparison.OrdinalIgnoreCase) ||
            module.Metadata.Keywords.Any(keyword => keyword.Contains(normalized, StringComparison.OrdinalIgnoreCase)));
    }

    public IToolModule? GetById(string id)
    {
        return _modules.FirstOrDefault(module => string.Equals(module.Id, id, StringComparison.OrdinalIgnoreCase));
    }

    public static IEnumerable<IToolModule> DefaultModules()
    {
        return RawToolData
            .Split('\n', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)
            .Select(ParseModule)
            .Concat([DevEnvironmentConfigModule()])
            .OrderBy(module => CategorySortIndex(module.Metadata.Category))
            .ThenBy(module => module.Metadata.Name, StringComparer.CurrentCulture);
    }

    private static IToolModule DevEnvironmentConfigModule()
    {
        return new ToolModule(new ToolMetadata(
            "dev_environment_config",
            "开发环境配置",
            "检测本机开发环境，并从官方来源下载、安装或按源码配方构建开发工具。",
            ToolCategory.Dev,
            ["go", "python", "java", "jdk", "docker", "mysql", "node", "dotnet", "git", "rust", "cmake", "download", "install"],
            false,
            IconForCategory(ToolCategory.Dev)));
    }

    private static IToolModule ParseModule(string line)
    {
        var parts = line.Split('\t');
        var id = parts.ElementAtOrDefault(0) ?? string.Empty;
        var name = parts.ElementAtOrDefault(1) ?? id;
        var description = parts.ElementAtOrDefault(2) ?? string.Empty;
        var category = ParseCategory(parts.ElementAtOrDefault(3));
        var offline = bool.TryParse(parts.ElementAtOrDefault(4), out var parsedOffline) && parsedOffline;
        var keywords = (parts.ElementAtOrDefault(5) ?? string.Empty)
            .Split(';', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)
            .Distinct(StringComparer.OrdinalIgnoreCase)
            .ToArray();

        return new ToolModule(new ToolMetadata(id, name, description, category, keywords, offline, IconForCategory(category)));
    }

    private static ToolCategory ParseCategory(string? value)
    {
        return value?.Trim().ToLowerInvariant() switch
        {
            "dev" => ToolCategory.Dev,
            "plugin" => ToolCategory.Plugin,
            "network" => ToolCategory.Network,
            "security" => ToolCategory.Security,
            "data" => ToolCategory.Data,
            "calculator" => ToolCategory.Calculator,
            "text" => ToolCategory.Text,
            "image" => ToolCategory.Image,
            "design" => ToolCategory.Design,
            "life" => ToolCategory.Life,
            "system" => ToolCategory.System,
            _ => ToolCategory.Dev
        };
    }

    private static int CategorySortIndex(ToolCategory category)
    {
        return category switch
        {
            ToolCategory.Plugin => 1,
            ToolCategory.Dev => 2,
            ToolCategory.Network => 3,
            ToolCategory.Security => 4,
            ToolCategory.Data => 5,
            ToolCategory.Calculator => 6,
            ToolCategory.Text => 7,
            ToolCategory.Image => 8,
            ToolCategory.Design => 9,
            ToolCategory.Life => 10,
            ToolCategory.System => 11,
            _ => 0,
        };
    }

    private static string IconForCategory(ToolCategory category)
    {
        return category switch
        {
            ToolCategory.Plugin => "\uECAA",
            ToolCategory.Dev => "\uE943",
            ToolCategory.Network => "\uE774",
            ToolCategory.Security => "\uE72E",
            ToolCategory.Data => "\uE9D9",
            ToolCategory.Calculator => "\uE8EF",
            ToolCategory.Text => "\uE8D2",
            ToolCategory.Image => "\uEB9F",
            ToolCategory.Design => "\uE790",
            ToolCategory.Life => "\uE753",
            ToolCategory.System => "\uE950",
            _ => "\uE8FD",
        };
    }

    private const string RawToolData = """
html_js_playground	HTML/JS 渲染器	运行 HTML、CSS、JS、引用脚本并查看输出日志	dev	false	html;js;webview;plugin;playground
json_formatter	JSON 格式化	美化、压缩并校验 JSON 内容	dev	true	json;format;pretty;minify
base64_codec	Base64 编解码	在 Base64 与 UTF-8 文本之间转换	dev	true	base64;encode;decode
compression_codec	压缩编解码	GZip、Deflate、Brotli 文本与 Base64 压缩解压	dev	true	compress;gzip;deflate;brotli;base64
url_codec	URL 编解码	URL 百分号编码、解码与参数检查	dev	true	url;encode;decode
html_entity	HTML 实体转换	HTML 实体编码和解码	dev	true	html;entity;escape
html_minifier	HTML/代码压缩	压缩 HTML、CSS 或 JavaScript 片段	dev	true	html;css;js;minify
regex_tool	正则测试	实时测试正则匹配结果	dev	true	regex;regular expression
js_obfuscator	JS 代码混淆	轻量混淆 JavaScript 代码	dev	true	javascript;obfuscate
uuid_generator	UUID 生成	生成 UUID/GUID 标识符	dev	true	uuid;guid
ulid_generator	ULID 生成	生成唯一且可排序的 ULID 标识符	dev	true	ulid;id
timestamp_converter	时间戳转换	Unix 时间戳与本地时间互转	dev	true	timestamp;date;time
number_base	进制转换	二进制、八进制、十进制和十六进制互转	dev	true	base;binary;hex
number_base_converter	进制转换器	常用数字进制互转	dev	true	base;converter;binary;hex
csv_json_converter	CSV/JSON 转换	CSV 表格与 JSON 结构互转	dev	true	csv;json;table
column_extractor	列提取器	按列号提取多列文本或表格字段	dev	true	column;csv;extract
csv_tsv_converter	CSV/TSV 转换	CSV 与 TSV 快速互转	dev	true	csv;tsv
yaml_json_converter	YAML/JSON 转换	轻量键值结构与 JSON 互转	dev	true	yaml;json
xml_formatter	XML 格式化	校验并美化 XML 文本	dev	true	xml;format
sql_formatter	SQL 格式化	整理常见 SQL 查询语句	dev	true	sql;format
unicode_codec	Unicode 转义	文本与 Unicode 转义序列互转	dev	true	unicode;escape
punycode_codec	Punycode/IDN 转换	国际化域名与 ASCII 域名互转	dev	true	punycode;idn
jwt_decoder	JWT 解码	本地解析 JWT 头部与载荷	dev	true	jwt;token
query_builder	Query 参数构建	URL Query 字符串与键值对互转	dev	true	query;url;params
form_urlencoded_builder	表单编码构建	x-www-form-urlencoded 内容生成和解析	dev	true	form;urlencoded
key_value_converter	键值对转换	JSON、ENV、Query 等键值格式互转	dev	true	kv;json;env
cron_helper	Cron 辅助	校验并解释五段 Cron 表达式	dev	true	cron;schedule
unicode_block_lookup	Unicode 区段速查	查询常见 Unicode 区段范围	dev	true	unicode;block
charset_lookup	字符集速查	查询常见字符集编码说明	dev	true	charset;encoding
regex_preset_lookup	正则预设速查	查询常见正则表达式模板	dev	true	regex;preset
magic_number_lookup	文件头速查	查询文件魔数和对应格式	dev	true	magic number;file header
html_text_extractor	HTML 正文提取	移除标签并提取纯文本	dev	true	html;text;extract
slug_generator	Slug 生成	把标题转换为 URL 友好的 slug	dev	true	slug;url
markdown_table_normalizer	Markdown 表格整理	补齐、对齐并规范化 Markdown 表格	text	true	markdown;table
markdown_preview	Markdown 预览整理	生成 Markdown 结构摘要、纯文本预览和轻量规范化	text	true	markdown;preview;commonmark
json_path_helper	JSON 路径辅助	从 JSON 结构中提取常见路径表达式	dev	true	json;path
hash_generator	哈希计算	计算 MD5、SHA1、SHA256 和 SHA512	security	true	hash;md5;sha
hmac_generator	HMAC 生成	用密钥生成 HMAC 摘要	security	true	hmac;hash
totp_generator	TOTP 验证码	根据 Base32 密钥本地生成一次性验证码	security	true	totp;otp;2fa;mfa;base32
password_generator	密码生成	生成随机强密码	security	true	password;random
profanity_check	敏感词检查	检查文本中可能的敏感词	security	true	profanity;check
hash_manifest_builder	哈希清单生成	为文件列表生成 SHA256 清单	security	true	hash;manifest
hash_manifest_verify	哈希清单校验	根据清单校验文件哈希	security	true	hash;verify
safe_browser	安全浏览器	在应用内打开隔离 WebView2 浏览器	network	false	browser;webview
wx_domain_check	微信域名检测说明	打开微信官方文档入口并说明匿名检测限制	security	false	wechat;domain
ip_lookup	IP 归属地查询	查询 IP 归属地信息	network	false	ip;location
ip_info	IP/域名详情	查询 IP 或域名网络详情	network	false	ip;domain
dns_query	DNS 解析	查询 A、MX、TXT 等 DNS 记录	network	false	dns;record
domain_price	域名官方信息	查询域名 RDAP、注册状态与官方公开信息	network	false	domain;rdap;whois
smart_search	聚合搜索	聚合搜索工具和常用入口	network	false	search;ai
rdap_domain_lookup	域名 RDAP 查询	通过 RDAP 查询域名注册信息	network	false	rdap;domain
rdap_ip_lookup	IP/ASN RDAP 查询	通过 RDAP 查询 IP 或 ASN 信息	network	false	rdap;ip;asn
http_diagnostic	HTTP 诊断	检查 URL 状态码、响应头和耗时	network	false	http;diagnostic
url_redirect_trace	URL 跳转追踪	追踪 URL 重定向链、状态码和最终地址	network	false	url;redirect;trace;http
url_inspector	URL 结构解析	解析 URL 协议、主机、路径和参数	network	true	url;inspect
domain_extractor	域名提取	从 URL 或文本中提取唯一域名	network	true	domain;extract
cidr_subnet_calculator	CIDR 子网计算	计算 IPv4 CIDR 掩码与地址范围	network	true	cidr;subnet
mime_lookup	MIME 类型速查	查询常见 MIME 类型	network	true	mime
http_status_lookup	HTTP 状态码速查	查询常见 HTTP 状态码含义	network	true	http;status
port_lookup	常见端口速查	查询常见端口与服务名称	network	true	port;service
dns_record_lookup	DNS 记录速查	查询 DNS 记录类型用途	network	true	dns;record
weather	天气查询	查询城市天气与空气质量	network	false	weather;city
hotboard	综合热榜	聚合热门榜单、新闻和实时资讯	data	false	hot;news
bili_hot	B 站热榜	获取哔哩哔哩热门内容	data	false	bilibili;hot
baidu_hot	百度热搜	获取百度热搜榜	data	false	baidu;hot
zhihu_hot	知乎热榜	获取知乎热榜	data	false	zhihu;hot
cctv_news	央视新闻	获取央视新闻摘要	data	false	news;cctv
tech_news	科技新闻	获取科技资讯	data	false	news;tech
football_news	体育新闻	获取足球和体育新闻	data	false	football;sports
movie_box_office	电影票房	查询电影票房数据	data	false	movie;box office
ai_latest_news	AI 全网最新资讯	按分类查看 AI 模型、工具、研究、产业和安全资讯	data	false	ai;news;latest
earthquake_info	地震信息	获取近期全球地震信息	data	false	earthquake
gold_price	黄金价格	获取黄金价格与市场摘要	data	false	gold;price
oil_price	成品油价格政策	查看国家发展改革委成品油价格政策发布入口	data	false	oil;price
train_query	列车查询	查询列车、站点和时刻信息	data	false	train;railway
history_today	历史上的今天	查询当天历史事件	data	false	history;today
city_route_query	城际路线查询	查询两个城市之间的距离、耗时、油费、过路费和路况	data	false	city;route;travel;cost
car_info	车辆信息	查询车辆和地区参考数据	data	true	car;reference
sanguosha_skin	三国杀皮肤	查询三国杀皮肤配置	data	true	sanguosha;skin
calculator_tool	计算器	基础四则运算和表达式计算	calculator	true	calculator;math
unit_converter	单位换算	常用单位换算	calculator	true	unit;convert
bmi_calculator	BMI 计算	根据体重和身高计算 BMI	calculator	true	bmi;health
percentage_calculator	百分比计算	计算部分值占整体的百分比	calculator	true	percent
percentage_change_calculator	涨跌幅计算	计算新旧数值之间的百分比变化	calculator	true	percent;change
discount_calculator	折扣计算	计算折后价与优惠金额	calculator	true	discount;price
tax_calculator	税费计算	根据税率计算含税价、税额与未税价	calculator	true	tax;vat
ratio_simplifier	比例化简	把整数比例化简为最简形式	calculator	true	ratio;gcd
average_calculator	平均值计算	计算平均值、总和与极值	calculator	true	average;mean
median_calculator	中位数计算	计算中位数和四分位信息	calculator	true	median;statistics
gcd_lcm_calculator	最大公约数/最小公倍数	计算多个整数的 GCD 与 LCM	calculator	true	gcd;lcm
permutation_calculator	排列数计算	计算 P(n,r) 排列数量	calculator	true	permutation
combination_calculator	组合数计算	计算 C(n,r) 组合数量	calculator	true	combination
date_difference_calculator	日期差计算	计算两个日期之间的时间差	life	true	date;difference
workday_calculator	工作日统计	统计两个日期之间的工作日	life	true	workday;calendar
age_calculator	年龄计算	根据出生日期计算年龄	life	true	age;birthday
simple_interest_calculator	单利计算	根据本金、利率和期限计算单利	calculator	true	interest;simple
compound_interest_calculator	复利计算	计算复利终值	calculator	true	interest;compound
loan_emi_calculator	等额本息月供	计算贷款月供、总还款和利息	calculator	true	loan;emi
length_converter	长度换算	米、千米、英尺等长度单位换算	calculator	true	length;unit
weight_converter	重量换算	千克、克、磅等重量单位换算	calculator	true	weight;mass
temperature_converter	温度换算	摄氏度、华氏度和开尔文互转	calculator	true	temperature
speed_converter	速度换算	米每秒、千米每小时等速度换算	calculator	true	speed
area_converter	面积换算	平方米、公顷、亩等面积换算	calculator	true	area
volume_converter	体积换算	立方米、升、加仑等体积换算	calculator	true	volume
data_size_converter	数据容量换算	B、KB、MB、GB、TB 互转	calculator	true	data size
time_duration_converter	时长换算	秒、分钟、小时、天和周互转	calculator	true	duration
text_statistics	文本统计	统计字数、行数和字符分布	text	true	text;statistics
case_converter	大小写转换	转换大小写、标题和命名风格	text	true	case
chinese_converter	简繁转换	简体和繁体中文基础互转	text	true	chinese
text_diff	文本对比	对比两段文本差异	text	true	diff
random_generator	随机生成器	生成随机字符串、数字或颜色	text	true	random
ai_translation	AI 翻译	保留 AI 翻译入口和配置位	text	false	translate;ai
ymhut_uutool_suite	UU 工具合集	聚合常用小工具入口	text	true	uutool;suite
text_deduplicator	文本去重	按行去重并保留顺序	text	true	dedupe
text_sorter	文本排序	按字典序排序多行文本	text	true	sort
text_filter	文本过滤	按关键字或正则筛选文本	text	true	filter
delimiter_converter	分隔符转换	在逗号、制表符和换行之间转换	text	true	delimiter
filename_formatter	文件名格式化	批量清洗文件名和路径名	text	true	filename
text_splitter	文本拆分	按分隔符批量拆分文本	text	true	split
text_merger	文本合并	合并多行文本	text	true	merge
text_numbering	文本编号	为每行添加递增序号	text	true	numbering
blank_line_cleaner	空行清理	移除空白行	text	true	blank line
whitespace_normalizer	空白规范化	清理多余空格和连续空白	text	true	whitespace
prefix_suffix_batch	前后缀批处理	按行追加统一前缀或后缀	text	true	prefix;suffix
line_column_transformer	行列互转	多行文本与分隔列表互转	text	true	line;column
list_sampler	列表抽样	从列表中随机抽取项目	text	true	sample
list_chunker	列表分块	按固定大小切分长列表	text	true	chunk
list_intersection	列表交集	输出两个列表的交集	text	true	intersection
list_union	列表并集	合并两个列表并去重	text	true	union
list_difference	列表差集	输出左侧列表独有项目	text	true	difference
list_group_statistics	列表分组统计	统计列表项目出现次数	text	true	group;count
duplicate_detector	重复项检测	输出重复出现的内容和次数	text	true	duplicate
line_length_analyzer	行长度分析	分析每行长度与整体分布	text	true	line length
keyword_counter	关键词计数	统计关键词命中次数	text	true	keyword;count
template_filler	模板填充	用键值对替换模板占位符	text	true	template
path_normalizer	路径规范化	批量标准化文件或目录路径	text	true	path;normalize
path_breakdown	路径拆解	拆解目录、文件名和扩展名	text	true	path
extension_extractor	扩展名提取	从路径列表提取扩展名	text	true	extension
extension_statistics	扩展名统计	统计扩展名分布	text	true	extension;statistics
file_manifest_builder	文件清单生成	生成路径、大小和时间清单	text	true	manifest
batch_rename_preview	批量重命名预览	预览批量重命名结果	text	true	rename
indexed_rename_preview	序号重命名预览	按前缀和序号预览命名方案	text	true	rename;index
manifest_deduplicator	清单去重	清单或路径列表去重	text	true	manifest;dedupe
manifest_sorter	清单排序	清单或路径列表排序	text	true	manifest;sort
manifest_template_export	清单模板导出	输出 JSON、CSV、TSV 清单模板	text	true	manifest;template
text_trimmer	文本裁剪	按行去除前后空白	text	true	trim
text_reverser	文本反转	反转字符、单词或整行顺序	text	true	reverse
markdown_list_cleaner	Markdown 列表清理	规范 Markdown 列表项目	text	true	markdown;list
line_pair_zipper	双列合并	将两组逐行数据按顺序配对	text	true	zip;pair
ascii_art	ASCII 艺术	生成简单 ASCII 艺术文本	design	true	ascii;art
color_picker	颜色工具	解析、转换并展示颜色值	design	true	color;hex;rgb
color_contrast_checker	颜色对比度	计算前景与背景色的 WCAG 对比度	design	true	color;contrast;wcag;accessibility
qr_generator	二维码生成	根据文本生成二维码	image	true	qr;qrcode
qrcode_scanner	二维码扫描	识别图片中的二维码	image	true	qr;scan
archive_tool	归档工具	创建、查看或解包 zip/tar 归档	image	true	archive;zip;tar
image_processor	图片处理	查看图片信息并进行基础处理	image	true	image;resize
image_metadata_inspector	图片元数据	读取本地图片格式、尺寸、体积和基础元数据	image	true	image;metadata;exif;dimensions
media_player	媒体播放器	沉浸式本地影音播放	image	false	media;player
qq_avatar	QQ 资料查询	查询 QQ 头像与公开资料	life	false	qq;avatar;profile
random_cinema	随机播放室	远程随机图片和随机视频播放	image	false	movie;random;image;video
shelf_life	保质期计算	按生产日期和保质期计算到期时间	life	true	shelf life
timezone_abbr_lookup	时区缩写速查	查询时区缩写和 UTC 偏移	life	true	timezone;utc
system_info	系统信息	查看 CPU、内存、系统和运行状态	system	true	system;info
system_tool	系统工具	常用系统操作和维护入口	system	true	system;tool
serial_terminal	串口终端	枚举 COM 口并支持文本、HEX、定时发送和接收日志	system	false	serial;com;uart;terminal
pc_benchmark	性能跑分	执行轻量性能测试	system	true	benchmark
""";
}
