using System.Text.RegularExpressions;

namespace SGModule.MarkdownKit {
    public static class MarkdownConvert {
        /// <summary>
        ///     将md转换为富文本标签
        /// </summary>
        /// <param name="markdown"></param>
        /// <returns></returns>
        public static string ToRichText(string markdown) {
            // 移除每一行行尾的多余空格和制表符
            markdown = Regex.Replace(markdown, @"[ \t]+$", "");

            // 标题替换 (支持 "#### " 等不同级别的标题)
            markdown = Regex.Replace(markdown, @"^(#{1,6})\s*(.+)$", match => {
                var level = match.Groups[1].Value.Length; // 获取标题级别
                var content = match.Groups[2].Value.Trim(); // 去除标题内容的多余空格


                // 标题大小规则：越小的标题级别，字体越大
                var baseSize = 40; // 默认正文字体大小
                var size = baseSize + (6 - level) * 5; // 一级标题最大，六级标题最小
                var str = $"<b><size={size}>{content}</size></b>\n";
                if (level <= 2) {
                    str = $"<u>{str}</u>";
                }

                return str; // 设置标题大小
            }, RegexOptions.Multiline);

            // 粗体替换 ( **加粗** )
            markdown = Regex.Replace(markdown, @"\*\*(.+?)\*\*", "<b>$1</b>");

            // 斜体替换 ( *斜体* )
            markdown = Regex.Replace(markdown, @"\*(.+?)\*", "<i>$1</i>");

            // 下划线替换 ( __下划线__ )
            markdown = Regex.Replace(markdown, @"__(.+?)__", "<u>$1</u>");

            // 删除线替换 ( ~~删除线~~ )
            markdown = Regex.Replace(markdown, @"~~(.+?)~~", "<s>$1</s>");

            // 超链接替换 ( [文字](链接) )
            markdown = Regex.Replace(markdown, @"\[(.+?)\]\((.+?)\)", "<a href='$2'>$1</a>");

            // 无序列表替换 ( - 或 * 开头)
            markdown = Regex.Replace(markdown, @"^\s*[-*]\s+(.+)$", match => {
                var content = match.Groups[1].Value.Trim();
                return $"• {content}"; // 使用 • 作为无序列表的符号
            }, RegexOptions.Multiline);

            // 有序列表替换 ( 1. 或 2. 开头)
            markdown = Regex.Replace(markdown, @"^\s*\d+\.\s+(.+)$", match => {
                var content = match.Groups[1].Value.Trim();
                return $"<b>{content}</b>"; // 有序列表使用加粗标记
            }, RegexOptions.Multiline);

            // 移除多余的连续空行 (将多个空行压缩为一个空行)
            markdown = Regex.Replace(markdown, @"(\r?\n){2,}", "\n");

            return markdown;
        }

        /// <summary>
        ///     将md文本转换为UBB语法的富文本
        /// </summary>
        /// <param name="markdown"></param>
        /// <param name="textBaseSize"></param>
        /// <returns></returns>
        public static string ToUBB(string markdown, int textBaseSize) {
            // 移除每一行行尾的多余空格和制表符
            markdown = Regex.Replace(markdown, @"[ \t]+$", "");

            // 标题替换 (支持 "#### " 等不同级别的标题)
            markdown = Regex.Replace(markdown, @"^(#{1,6})\s*(.+)$", match => {
                var level = match.Groups[1].Value.Length; // 获取标题级别
                var content = match.Groups[2].Value.Trim(); // 去除标题内容的多余空格

                // 标题大小规则：越小的标题级别，字体越大
                var baseSize = textBaseSize; // 默认正文字体大小
                var size = baseSize + (6 - level) * 3; // 一级标题最大，六级标题最小

                var str = $"[b][size={size}]{content}[/size][/b]\n";
                if (level <= 2) {
                    str = $"[u]{str}[/u]";
                }

                return str; // 设置标题大小
            }, RegexOptions.Multiline);

            // 粗体替换 ( **加粗** -> [b]加粗[/b])
            markdown = Regex.Replace(markdown, @"\*\*(.+?)\*\*", "[b]$1[/b]");

            // 斜体替换 ( *斜体* -> [i]斜体[/i])
            markdown = Regex.Replace(markdown, @"\*(.+?)\*", "[i]$1[/i]");

            // 下划线替换 ( __下划线__ -> [u]下划线[/u])
            markdown = Regex.Replace(markdown, @"__(.+?)__", "[u]$1[/u]");

            // 删除线替换 ( ~~删除线~~ -> [s]删除线[/s])
            markdown = Regex.Replace(markdown, @"~~(.+?)~~", "[s]$1[/s]");

            // 超链接替换 ( [文字](链接) -> [url=链接]文字[/url])
            markdown = Regex.Replace(markdown, @"\[(.+?)\]\((.+?)\)", "[url=$2]$1[/url]");

            // 无序列表替换 ( - 或 * 开头 -> • 项目内容)
            markdown = Regex.Replace(markdown, @"^\s*[-*]\s+(.+)$", match => {
                var content = match.Groups[1].Value.Trim();
                return $"• {content}"; // 使用 • 作为无序列表的符号
            }, RegexOptions.Multiline);

            // 有序列表替换 ( 1. 或 2. 开头 -> 加粗项目内容)
            markdown = Regex.Replace(markdown, @"^\s*\d+\.\s+(.+)$", match => {
                var content = match.Groups[1].Value.Trim();
                return $"[b]{content}[/b]"; // 有序列表使用加粗标记
            }, RegexOptions.Multiline);

            // 移除多余的连续空行 (将多个空行压缩为一个空行)
            markdown = Regex.Replace(markdown, @"(\r?\n){2,}", "\n");

            return markdown;
        }
    }
}
