package com.zt.plat.module.base.service.doctemplate.render.export;

import lombok.extern.slf4j.Slf4j;

/**
 * 抽象导出策略（模板方法模式）
 * 定义导出的标准流程框架
 *
 * @author hwc
 */
@Slf4j
public abstract class DocTemplateAbstractExportStrategy implements IExportStrategy {

    /**
     * 模板方法：定义导出流程骨架
     */
    @Override
    public final Object export(String htmlContent, String templateName) {
        // 1. 验证输入
        validateInput(htmlContent, templateName);

        // 2. 生成文件名
        String fileName = generateFileName(templateName);

        // 3. 执行具体的导出逻辑
        Object result = doExport(htmlContent, fileName);

        // 4. 后处理（如日志、监控等）
        postProcess(fileName, result);

        return result;
    }

    /**
     * 验证输入
     */
    protected void validateInput(String htmlContent, String templateName) {
        if (htmlContent == null || htmlContent.isEmpty()) {
            throw new IllegalArgumentException("HTML内容为空");
        }
        if (templateName == null || templateName.isEmpty()) {
            throw new IllegalArgumentException("模板名称为空");
        }
    }

    /**
     * 生成文件名
     */
    protected String generateFileName(String templateName) {
        return templateName + "_" + System.currentTimeMillis() + getFileExtension();
    }

    /**
     * 具体的导出逻辑（由子类实现）
     *
     * @param htmlContent HTML内容
     * @param fileName    文件名
     * @return 导出结果
     */
    protected abstract Object doExport(String htmlContent, String fileName);

    /**
     * 获取文件扩展名
     *
     * @return 文件扩展名
     */
    protected abstract String getFileExtension();

    /**
     * 后处理逻辑（可选，子类可覆盖）
     *
     * @param fileName 文件名
     * @param result   导出结果
     */
    protected void postProcess(String fileName, Object result) {
        // 默认实现：记录日志
        log.info("导出完成: {}, 类型: {}", fileName, getExportType().getDescription());
    }
}