package com.seer.teach.teacher.common.utils;

import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.HashMap;
import java.util.Map;

/**
 * <p>
 * Html构建工具类库
 * </p >
 *
 * @author Captain
 * @since 2025-07-26 14:14
 */
public class HtmlBuildUtils {

    public static final String QUESTION_TITLE = "题目: ";

    public static final String OPTION = "选项: ";

    public static final String PROCESS = "解题过程: ";

    public static final String ANSWER = "答案: ";

    public static final String TIP = "只有错题重做后小SeerTeach才能给您解析和答案哦！";

    private static final String P_TAG = "<p style=\"margin:.6em 0;line-height:1.7;word-break:break-word;overflow-wrap:anywhere;\">%s</p>";

    private static final String H4_TAG = "<h4 style=\"margin:0.8em 0 0.4em;font-size:1.05em;font-weight:600;line-height:1.5;\">%s</h4>";

    private static final String BR_TAG = "<br/>";

    private static final String IMG_TAG = "<img src=\"%s\" style=\"max-width:100%%;height:auto;display:inline-block;vertical-align:middle;margin:.4em 0;\"/>";

    private static final String IMG_PLACEHOLDER = "@@image%s@@";

    private static final String LINE_BREAK = "\n";

    //LaTeX缓存
    private static final Map<String, String> LATEX_CACHE = new HashMap<>();

    /**
     * 生成一个<p>标签的HTML文本
     *
     * @param content 内容
     * @return 格式化后的<p>标签HTML
     */
    public static String buildParagraph(String content) {
        content = formatLatex(content);
        content = content.replace(LINE_BREAK, BR_TAG);
        return String.format(P_TAG, content);
    }


    /**
     * 生成一个<p>标签的HTML文本
     *
     * @param content 内容
     * @return 格式化后的<p>标签HTML
     */
    public static StringBuffer buildParagraphAsStringBuffer(String content) {
        content = formatLatex(content);
        return new StringBuffer(String.format(P_TAG, content));
    }

    /**
     * 生成一个<h4>标签的HTML文本
     *
     * @param content 内容
     * @return 格式化后的<h4>标签HTML
     */
    public static String buildHeader4(String content) {
        content = formatLatex(content);
        return String.format(H4_TAG, content);
    }


    /**
     * H4标签水平居中
     *
     * @param content
     * @return
     */
    public static String buildHeader4Center(String content) {
        content = formatLatex(content);
        return String.format("<h4 style=\"text-align: center;\">%s</h4>", content);
    }

    public static StringBuffer buildHeader4AsStringBuffer(String content) {
        content = formatLatex(content);
        return new StringBuffer(String.format(H4_TAG, content));
    }

    /**
     * 生成换行符
     *
     * @return <br/> 标签
     */
    public static String buildBreakLine() {
        return BR_TAG;
    }

    /**
     * 生成图片标签
     *
     * @param imgUrl 图片URL
     * @return <img>标签
     */
    public static String buildImg(String imgUrl) {
        return String.format(IMG_TAG, imgUrl);
    }

    /**
     * 判断占位符个数
     *
     * @param input 输入字符串
     * @return 占位符个数
     */
    public static int countImagePlaceholders(String input) {
        // 匹配 @@image@@、@@image0@@、@@image123@@ 等
        Pattern pattern = Pattern.compile("@@image\\d*@@");
        Matcher matcher = pattern.matcher(input);

        int count = 0;
        while (matcher.find()) {
            count++;
        }

        return count;
    }

    /**
     * 将题目中的 LaTeX 数学公式识别并加上 \( 和 \) 如果没有latex的话则自动返回原数据
     * <p>
     * 优化：每个公式只会被处理一次，通过缓存避免重复处理
     * </p>
     *
     * @param input 输入字符串
     * @return 格式化后的字符串
     */
    public static String formatLatex(String input) {
        if (LATEX_CACHE.containsKey(input)) {
            return LATEX_CACHE.get(input);
        }

        // 正则匹配形如 $...$ 的内容
        Pattern pattern = Pattern.compile("\\$(.*?)\\$");
        Matcher matcher = pattern.matcher(input);
        StringBuffer result = new StringBuffer();

        while (matcher.find()) {
            String latex = matcher.group(1);
            // 用 \( 和 \) 包裹内容，防止 \f 被错误解析
            String replacement = Matcher.quoteReplacement("\\(" + latex + "\\)");
            matcher.appendReplacement(result, replacement);
        }
        matcher.appendTail(result);

        String formattedString = result.toString();

        // 将格式化后的 LaTeX 缓存起来
        LATEX_CACHE.put(input, formattedString);

        return formattedString;
    }

    /**
     * 构建带有图片的富文本内容
     * <p>
     * 该方法会将文本中的图片占位符(@@image0@@, @@image1@@等)替换为实际的图片标签
     * 并将整个内容包装在<p>标签中
     * </p>
     *
     * @param text   包含图片占位符的原始文本内容
     * @param images 图片URL列表，按顺序对应占位符
     * @return 替换占位符后并包装在<p>标签中的HTML文本
     */
    public static String buildingRichTextImages(String text, List<String> images) {
        Integer imageCount = countImagePlaceholders(text);
        StringBuilder formatted = new StringBuilder(text);
        for (int i = 0; i < imageCount; i++) {
            String placeholder = String.format(IMG_PLACEHOLDER, i);
            String imageTag = buildImg(images.get(i));
            int index = formatted.indexOf(placeholder);
            if (index != -1) {
                formatted.replace(index, index + placeholder.length(), imageTag);
            }
        }
        return buildParagraph(formatted.toString());
    }


    /**
     * 构建带有图片的富文本内容
     * <p>
     * 该方法会将文本中的图片占位符(@@image0@@, @@image1@@等)替换为实际的图片标签
     * 并将整个内容包装在<p>标签中
     * </p>
     *
     * @param text   包含图片占位符的原始文本内容
     * @param images 图片URL列表，按顺序对应占位符
     * @return 替换占位符后并包装在<p>标签中的HTML文本
     */
    public static StringBuffer buildingRichTextImagesAsStringBuffer(String text, List<String> images) {
        Integer imageCount = countImagePlaceholders(text);
        StringBuilder formatted = new StringBuilder(text);
        for (int i = 0; i < imageCount; i++) {
            String placeholder = String.format(IMG_PLACEHOLDER, i);
            String imageTag = buildImg(images.get(i));
            int index = formatted.indexOf(placeholder);
            if (index != -1) {
                formatted.replace(index, index + placeholder.length(), imageTag);
            }
        }
        return new StringBuffer(buildParagraph(formatted.toString()));
    }

    public static String buildTip() {
        return buildHeader4Center(TIP);
    }


    public static String buildQuestionTitleAndProcessHtml(String title, String process) {
        String result = buildParagraph(title);
        return result + buildParagraph(process);
    }

    /**
     * 将学习时长（秒）转化为 HTML 格式：学习时长-<font color="#00C224">x</font>小时<font color="#00C224">y</font>分
     *
     * @param studyTime 学习时长，单位：秒
     * @return 格式化后的 HTML 字符串
     */
    public static String formatStudyTimeHtml(long studyTime) {
        if (studyTime <= 0) {
            return "学习时长-<font color=\"#00C224\">0</font>分";
        }
        long hours = studyTime / 3600;
        long minutes = (studyTime % 3600) / 60;
        StringBuilder sb = new StringBuilder("学习时长-");
        if (hours > 0) {
            sb.append("<font color=\"#00C224\">")
                    .append(hours)
                    .append("</font>小时");
        }
        if (minutes > 0) {
            sb.append("<font color=\"#00C224\">")
                    .append(minutes)
                    .append("</font>分");
        }
        return sb.toString();
    }

    /**
     * 将综合得分转化为 HTML 格式
     * 格式示例：综合得分-<font color="#00C224">82</font>分
     *
     * @param score 分数
     * @return 格式化后的 HTML 字符串
     */
    public static String formatScoreHtml(int score) {
        return String.format("综合得分-<font color=\"#00C224\">%d</font>分",score);
    }

    /**
     * 将超越百分比转化为 HTML 格式
     * 格式示例：超越<font color="#00C224">89%</font>的同学
     *
     * @param percent 百分比 (0-100)
     * @return 格式化后的 HTML 字符串
     */
    public static String formatSurpassHtml(int percent) {
        if (percent < 0) {
            percent = 0;
        }
        if (percent > 100) {
            percent = 100;
        }
        return String.format("超越<font color=\"#00C224\">%d%%</font>的同学", percent);
    }

}
