package com.agileboot.codegen.util;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.Map;

/**
 * Freemarker工具类
 */
@Slf4j
public class FreemarkerUtil {

    private static Configuration configuration;

    static {
        configuration = new Configuration(Configuration.VERSION_2_3_31);
        configuration.setClassForTemplateLoading(FreemarkerUtil.class, "/wol-module-codegen/src/main/resources/templates/code-generator");
        configuration.setDefaultEncoding("UTF-8");
    }

    /**
     * 根据模板生成代码
     *
     * @param templateName 模板名称
     * @param dataModel    数据模型
     * @return 生成的代码
     */
    public static String generateByTemplate(String templateName, Map<String, Object> dataModel) {
        try {
            Template template = configuration.getTemplate(templateName);
            StringWriter writer = new StringWriter();
            template.process(dataModel, writer);
            return writer.toString();
        } catch (IOException | TemplateException e) {
            log.error("生成代码失败，模板: {}, 错误: {}", templateName, e.getMessage(), e);
            return "// 生成失败: " + e.getMessage();
        }
    }

    /**
     * 根据模板内容生成代码
     *
     * @param templateContent 模板内容字符串
     * @param dataModel       数据模型
     * @return 生成的代码
     */
    public static String generateByContent(String templateContent, Map<String, Object> dataModel) {
        try {
            // 创建一个临时的Configuration用于处理字符串模板
            Configuration tempConfig = new Configuration(Configuration.VERSION_2_3_31);
            tempConfig.setDefaultEncoding("UTF-8");

            // 从字符串创建模板
            Template template = new Template("userTemplate", new StringReader(templateContent), tempConfig);
            StringWriter writer = new StringWriter();
            template.process(dataModel, writer);
            return writer.toString();
        } catch (IOException | TemplateException e) {
            log.error("使用模板内容生成代码失败，错误: {}", e.getMessage(), e);
            return "// 生成失败: " + e.getMessage();
        }
    }

    /**
     * 检查模板是否存在
     *
     * @param templateName 模板名称
     * @return 是否存在
     */
    public static boolean templateExists(String templateName) {
        try {
            configuration.getTemplate(templateName);
            return true;
        } catch (IOException e) {
            return false;
        }
    }

    /**
     * 获取模板文件的原始内容
     *
     * @param templateName 模板名称
     * @return 模板原始内容
     */
    public static String getTemplateContent(String templateName) {
        try {
            Template template = configuration.getTemplate(templateName);
            // 通过反射或其他方式获取模板源内容
            // 这里使用简单的方法：读取模板文件
            return readTemplateFile(templateName);
        } catch (IOException e) {
            log.error("获取模板内容失败: {}", templateName, e);
            return "// 模板文件不存在或读取失败: " + templateName;
        }
    }

    /**
     * 读取模板文件内容
     */
    private static String readTemplateFile(String templatePath) {
        try {
            java.io.InputStream inputStream = FreemarkerUtil.class.getResourceAsStream("/templates/code-generator/" + templatePath);
            if (inputStream != null) {
                return new String(inputStream.readAllBytes(), "UTF-8");
            } else {
                return "// 模板文件不存在: " + templatePath;
            }
        } catch (Exception e) {
            log.error("读取模板文件失败: {}", templatePath, e);
            return "// 读取模板文件失败: " + e.getMessage();
        }
    }
}
