/**
 * @ProjectName: 智慧评标-主观分助手
 * @Package: com.zhpb.gdyd_zhpb_zgf.config
 * @ClassName: DataInitializer
 * @Description: 应用启动时初始化数据
 * @Author: 张志锋
 * @Date: 2025-11-03
 * @Version: 1.0
 * @Copyright: © 2025 智慧评标-主观分助手
 */
package com.zhpb.gdyd_zhpb_zgf.config;

import com.zhpb.gdyd_zhpb_zgf.entity.mysql.File;
import com.zhpb.gdyd_zhpb_zgf.entity.mysql.PromptTemplate;
import com.zhpb.gdyd_zhpb_zgf.repository.mysql.FileRepository;
import com.zhpb.gdyd_zhpb_zgf.repository.mysql.PromptTemplateRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 数据初始化器
 */
@Component
public class DataInitializer implements CommandLineRunner {

    private static final Logger logger = LoggerFactory.getLogger(DataInitializer.class);

    @Autowired
    private PromptTemplateRepository promptTemplateRepository;

    @Autowired
    private FileRepository fileRepository;

    @Override
    public void run(String... args) throws Exception {
        logger.info("开始初始化系统数据...");

        // 初始化提示词模板
        initializePromptTemplates();

        logger.info("系统数据初始化完成");
    }

    /**
     * 初始化提示词模板
     */
    private void initializePromptTemplates() {
        logger.info("检查是否需要初始化提示词模板...");

        // 检查是否已有各种类型的模板
        long qaCount = promptTemplateRepository.countByTemplateType("qa");
        long summaryCount = promptTemplateRepository.countByTemplateType("summary");
        long comparisonCount = promptTemplateRepository.countByTemplateType("comparison");

        if (qaCount > 0 && summaryCount > 0 && comparisonCount > 0) {
            logger.info("所有提示词模板已存在 (QA: {}, Summary: {}, Comparison: {}), 跳过初始化", qaCount, summaryCount, comparisonCount);
            return;
        }

        logger.info("开始初始化提示词模板数据 (QA: {}, Summary: {}, Comparison: {})...", qaCount, summaryCount, comparisonCount);

        List<PromptTemplate> templatesToAdd = new ArrayList<>();

        // 如果没有QA模板，添加QA模板
        if (qaCount == 0) {
            templatesToAdd.addAll(Arrays.asList(
            createTemplate("tender-qa-general-001", "通用评标问答", 0,
                "你是一个专业的招标评审专家助手。请基于以下提供的招标文件内容，准确、客观地回答评审专家的问题。\n\n招标文件内容：\n{document_content}\n\n评审问题：{query}\n\n请遵循以下原则：\n1. 严格基于招标文件内容回答，不添加外部知识或个人观点\n2. 引用具体条款、页码或章节，便于核实\n3. 对于技术参数、商务条件要准确表述\n4. 如有多个相关条款，应进行归纳整理\n5. 对于文件未明确的内容，应明确说明\"招标文件中未明确规定\"\n6. 保持专业、客观、中立的态度\n\n评审意见：",
                "通用评标问答提示词，适用于各类招标项目的评审问答"),

            createTemplate("tender-qa-technical-002", "技术评审问答", 1,
                "你是一个专业的技术评审专家。请基于以下技术规格书和相关技术文档，回答技术评审相关问题。\n\n技术文档内容：\n{document_content}\n\n技术问题：{query}\n\n技术评审要点：\n1. 严格按照技术规格书要求进行评审\n2. 重点关注技术参数、性能指标、质量标准\n3. 识别技术风险和潜在问题\n4. 评估技术方案的可行性和先进性\n5. 检查技术指标是否满足最低要求\n6. 对于技术偏离应明确指出影响程度\n\n技术评审意见：\n- 符合性分析：\n- 技术风险评估：\n- 建议意见：",
                "技术评审专用提示词，重点关注技术参数、性能指标等技术评审内容"),

            createTemplate("tender-qa-commercial-003", "商务评审问答", 2,
                "你是一个专业的商务评审专家。请基于以下商务文件和报价文件，回答商务评审相关问题。\n\n商务文件内容：\n{document_content}\n\n商务问题：{query}\n\n商务评审要点：\n1. 严格按照招标文件商务要求进行评审\n2. 重点关注报价合理性、商务条件、付款方式\n3. 检查商务偏差及其影响\n4. 评估供应商的商务实力和信誉\n5. 审核商务条款的合规性和可行性\n6. 计算商务得分并给出评分理由\n\n商务评审意见：\n- 报价分析：\n- 商务条件评估：\n- 合规性检查：\n- 评分建议：",
                "商务评审专用提示词，重点关注报价、商务条件、付款方式等商务评审内容"),

            createTemplate("tender-qa-compliance-004", "合规性检查问答", 3,
                "你是一个专业的招标合规性审查专家。请基于招标文件和相关法律法规，回答合规性相关问题。\n\n招标文件及法律法规内容：\n{document_content}\n\n合规性问题：{query}\n\n合规性审查要点：\n1. 检查投标文件是否符合招标文件要求\n2. 审核供应商资质和相关证书\n3. 验证投标保证金、履约保证金等保证措施\n4. 审查投标文件完整性和有效性\n5. 识别潜在的违规行为和风险\n6. 确认投标有效期和投标截止时间\n\n合规性审查意见：\n- 资格审查：\n- 文件完整性：\n- 保证措施：\n- 违规风险：\n- 审查结论：",
                "合规性检查专用提示词，重点关注投标文件的合规性和有效性审查"),

            createTemplate("tender-qa-comparison-005", "供应商对比问答", 4,
                "你是一个专业的供应商对比分析专家。请基于多个供应商的投标文件，进行对比分析并回答相关问题。\n\n供应商投标文件内容：\n{document_content}\n\n对比分析问题：{query}\n\n供应商对比要点：\n1. 对比各供应商的技术方案差异\n2. 分析报价合理性和竞争力\n3. 评估供应商实力和服务能力\n4. 识别各供应商的优势和劣势\n5. 综合评价供应商的综合竞争力\n6. 提出供应商选择建议\n\n供应商对比分析：\n- 技术方案对比：\n- 商务条件对比：\n- 供应商实力评估：\n- 综合评分建议：\n- 推荐意见：",
                "供应商对比分析专用提示词，用于多个供应商投标文件的对比评审")
            ));
        }

        // 如果没有Summary模板，添加Summary模板
        if (summaryCount == 0) {
            templatesToAdd.add(
                createSummaryTemplate("default-summary-template-001", "默认文档摘要提示词", 10,
                    "章节标题：{title}\n\n请直接返回该章节的总结内容，不要任何开场白、结尾语或其他多余文字。不使用markdown格式。不说'好的，这是...'之类的话。只返回纯文本总结内容，300字以内，可以换行。总结要准确、客观、简洁，突出核心要点。",
                    "默认的文档摘要提示词模板，用于指导AI如何对文档章节进行结构化摘要")
            );
        }

        // 如果没有Comparison模板，添加Comparison模板
        if (comparisonCount == 0) {
            templatesToAdd.add(
                createComparisonTemplate("default-comparison-template-001", "默认供应商对比提示词", 11,
                    "请对以下供应商在{comparison_dimension}维度的表现进行对比分析。\n\n供应商信息：\n{supplier_info}\n\n请直接返回对比分析结果，不要任何开场白、结尾语或其他多余文字。不使用markdown格式。只返回纯文本分析内容，500字以内，可以换行。分析要求：客观、准确、突出差异和特点。",
                    "默认的供应商对比分析提示词模板，用于指导AI如何进行供应商间的横向对比")
            );
        }

        try {
            if (!templatesToAdd.isEmpty()) {
                promptTemplateRepository.saveAll(templatesToAdd);
                logger.info("成功初始化 {} 个提示词模板", templatesToAdd.size());
            } else {
                logger.info("没有需要初始化的提示词模板");
            }
        } catch (Exception e) {
            logger.error("初始化提示词模板失败", e);
        }

        // 初始化测试文件数据
        initializeTestFiles();
    }

    /**
     * 初始化测试文件数据
     */
    private void initializeTestFiles() {
        logger.info("开始初始化测试文件数据...");

        List<File> testFiles = Arrays.asList(
            createTestFile("file-001", "技术方案.pdf", "project-001", "supplier-001", 2048576L),
            createTestFile("file-002", "商务文件.pdf", "project-001", "supplier-002", 1536000L),
            createTestFile("file-003", "报价清单.xlsx", "project-001", "supplier-001", 512000L),
            createTestFile("file-004", "技术参数表.doc", "project-001", "supplier-002", 1024000L),
            createTestFile("file-005", "合规性承诺书.pdf", "project-001", "supplier-003", 768000L)
        );

        try {
            fileRepository.saveAll(testFiles);
            logger.info("成功初始化 {} 个测试文件", testFiles.size());
        } catch (Exception e) {
            logger.error("初始化测试文件失败", e);
        }
    }

    /**
     * 创建QA提示词模板对象
     */
    private PromptTemplate createTemplate(String templateId, String templateName, int sortOrder,
                                        String promptContent, String description) {
        PromptTemplate template = new PromptTemplate();
        template.setTemplateId(templateId);
        template.setTemplateName(templateName);
        template.setTemplateType("qa");
        template.setPromptContent(promptContent);
        template.setDescription(description);
        template.setIsActive(true);
        template.setSortOrder(sortOrder);
        template.setCreatedBy("system");
        template.setUpdatedBy("system");
        return template;
    }

    /**
     * 创建文档摘要提示词模板对象
     */
    private PromptTemplate createSummaryTemplate(String templateId, String templateName, int sortOrder,
                                               String promptContent, String description) {
        PromptTemplate template = new PromptTemplate();
        template.setTemplateId(templateId);
        template.setTemplateName(templateName);
        template.setTemplateType("summary");
        template.setPromptContent(promptContent);
        template.setDescription(description);
        template.setIsActive(true);
        template.setSortOrder(sortOrder);
        template.setCreatedBy("system");
        template.setUpdatedBy("system");
        return template;
    }

    /**
     * 创建供应商对比分析提示词模板对象
     */
    private PromptTemplate createComparisonTemplate(String templateId, String templateName, int sortOrder,
                                                  String promptContent, String description) {
        PromptTemplate template = new PromptTemplate();
        template.setTemplateId(templateId);
        template.setTemplateName(templateName);
        template.setTemplateType("comparison");
        template.setPromptContent(promptContent);
        template.setDescription(description);
        template.setIsActive(true);
        template.setSortOrder(sortOrder);
        template.setCreatedBy("system");
        template.setUpdatedBy("system");
        return template;
    }

    /**
     * 创建测试文件对象
     */
    private File createTestFile(String fileId, String fileName, String projectId, String supplierId, Long fileSize) {
        File file = new File();
        file.setFileId(fileId);
        file.setFileName(fileName);
        file.setProjectId(projectId);
        file.setSupplierId(supplierId);
        file.setFileSize(fileSize);
        file.setFileExtension(fileName.substring(fileName.lastIndexOf('.') + 1));
        file.setFilePath("/test/" + fileName); // 模拟路径
        file.setFileMd5("test-md5-" + fileId); // 模拟MD5
        file.setStatus("uploaded");
        file.setIsVectorized(true); // 设为已向量化，方便测试
        file.setVectorizationStatus("completed");
        file.setVectorizationCount(1);
        file.setDescription("测试文件 - " + fileName);
        return file;
    }
}
