package com.gxwebsoft.ai.service.impl;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.gxwebsoft.ai.constants.AuditContent1LeaderListConstants;
import com.gxwebsoft.ai.service.AuditContent1LeaderListService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import cn.hutool.core.util.StrUtil;

import java.util.*;
import java.util.stream.Collectors;

@Slf4j
@Service
public class AuditContent1LeaderListServiceImpl extends AbstractAuditContentService implements AuditContent1LeaderListService {

    // 工作流配置
    private static final String DIFY_WORKFLOW_TOKEN = "Bearer app-G0xD8Yu0tqwYEudtXuKFk2BH";

    @Override
    public JSONObject generateLeaderListTableData(String kbIds, String libraryKbIds, String projectLibrary, 
                                                String userName, String history, String suggestion) {
        log.info("开始生成领导班子名单数据 - 用户: {}, kbIds: {}, libraryIds: {}, projectLibrary: {}", 
                userName, kbIds, libraryKbIds, projectLibrary);
        
        long startTime = System.currentTimeMillis();
        
        try {
            // 1. 检索相关知识
            Map<String, List<String>> knowledgeSources = retrieveKnowledgeForLeaderList(kbIds, libraryKbIds, projectLibrary);
            
            // 2. 构建完整的知识上下文
            String knowledgeContext = buildCompleteKnowledgeContext(knowledgeSources, history, suggestion);
            
            // 3. 调用工作流生成数据
            JSONObject requestBody = buildWorkflowRequest(knowledgeContext, userName);
            JSONArray leaderListData = callWorkflow(DIFY_WORKFLOW_URL, DIFY_WORKFLOW_TOKEN, requestBody, "领导班子名单");
            
            // 4. 数据验证和补充
//            leaderListData = validateAndEnhanceLeaderListData(leaderListData);
            
            log.info("领导班子名单生成成功 - 记录数: {}, 处理时间: {}ms", 
                    leaderListData.size(), (System.currentTimeMillis() - startTime));
            
            return buildSuccessResponse(leaderListData, startTime, "leader_list_audit");
            
        } catch (Exception e) {
            log.error("生成领导班子名单失败", e);
            return buildErrorResponse("生成领导班子名单失败: " + e.getMessage());
        }
    }

    /**
     * 验证和增强领导班子名单数据
     */
    private JSONArray validateAndEnhanceLeaderListData(JSONArray originalData) {
        if (originalData == null || originalData.isEmpty()) {
            log.warn("原始数据为空，返回空数组");
            return new JSONArray();
        }
        
        JSONArray enhancedData = new JSONArray();
        
        for (int i = 0; i < originalData.size(); i++) {
            JSONObject item = originalData.getJSONObject(i);
            if (item != null) {
                // 确保所有必需字段都存在
                enhanceLeaderData(item);
                enhancedData.add(item);
            }
        }
        
        log.info("数据增强完成 - 原始记录数: {}, 增强后记录数: {}", originalData.size(), enhancedData.size());
        return enhancedData;
    }

    /**
     * 增强单个领导数据
     */
    private void enhanceLeaderData(JSONObject leaderData) {
        // 确保单位名称存在
        if (StrUtil.isBlank(leaderData.getString("unit"))) {
            leaderData.put("unit", "广西千汇食品有限公司");
        }
        
        // 确保部门信息存在
        if (StrUtil.isBlank(leaderData.getString("department"))) {
            String adminPosition = leaderData.getString("adminPosition");
            if (adminPosition != null) {
                if (adminPosition.contains("董事")) {
                    leaderData.put("department", "董事会");
                } else if (adminPosition.contains("经理") || adminPosition.contains("总监")) {
                    leaderData.put("department", "经理层");
                } else {
                    leaderData.put("department", "管理部门");
                }
            }
        }
        
        // 确保任职期间格式正确
        if (StrUtil.isBlank(leaderData.getString("tenurePeriod"))) {
            leaderData.put("tenurePeriod", "2023.4-至今");
        }
        
        // 确保主要工作责任完整
        if (StrUtil.isBlank(leaderData.getString("mainResponsibilities"))) {
            String position = leaderData.getString("adminPosition");
            if (position != null) {
                if (position.contains("董事长")) {
                    leaderData.put("mainResponsibilities", "主持公司全面工作，主管综合管理服务、安全生产、环境保护、品牌建设与管理等工作；主管综合管理部、设备安环部。");
                } else if (position.contains("总经理")) {
                    leaderData.put("mainResponsibilities", "负责战略规划、投资管理、项目招投标、质量安全、食品安全、应急管理、生产经营管理、组织人事、日常经营管理等工作；主管采购部、销售部、质量管理部、生产部。");
                } else if (position.contains("财务总监")) {
                    leaderData.put("mainResponsibilities", "主管财务管理、筹融资管理、会计核算、法律事务、合规管理、风险防控、审计管理、党建、党风廉政建设、宣传思想意识形态、统战工作、协助上级开展巡察工作等；主管财务部。");
                }
            }
        }
    }

    /**
     * 检索领导班子名单相关知识 - 优化查询策略
     */
    private Map<String, List<String>> retrieveKnowledgeForLeaderList(String kbIds, String libraryKbIds, String projectLibrary) {
        Map<String, List<String>> knowledgeSources = new HashMap<>();
        knowledgeSources.put("enterprise", new ArrayList<>());
        knowledgeSources.put("regulation", new ArrayList<>());
        knowledgeSources.put("auditCase", new ArrayList<>());
        
        // 构建更全面的查询词
        List<String> queries = buildEnhancedLeaderListQueries();
        
        // 企业单位库检索 - 扩大检索范围
        if (StrUtil.isNotBlank(kbIds)) {
            Arrays.stream(kbIds.split(","))
                .map(String::trim)
                .filter(StrUtil::isNotBlank)
                .forEach(kbId -> {
                    List<String> enterpriseKnowledge = queryKnowledgeBase(kbId, queries, 150); // 增加检索数量
                    knowledgeSources.get("enterprise").addAll(enterpriseKnowledge);
                    log.debug("企业知识库 {} 检索到 {} 条相关知识", kbId, enterpriseKnowledge.size());
                });
        }
        
        // 公共法律法规库检索
        if (StrUtil.isNotBlank(libraryKbIds)) {
            Arrays.stream(libraryKbIds.split(","))
                .map(String::trim)
                .filter(StrUtil::isNotBlank)
                .forEach(libId -> {
                    List<String> regulationKnowledge = queryKnowledgeBase(libId, queries, 80);
                    knowledgeSources.get("regulation").addAll(regulationKnowledge);
                });
        }
        
        // 审计案例库检索
        if (StrUtil.isNotBlank(projectLibrary)) {
            List<String> auditCaseKnowledge = queryKnowledgeBase(projectLibrary, queries, 50);
            knowledgeSources.get("auditCase").addAll(auditCaseKnowledge);
        }
        
        // 智能去重和排序
        knowledgeSources.forEach((key, list) -> {
            List<String> processed = list.stream()
                    .distinct()
                    .sorted(this::leaderListComparator)
                    .limit(getLimitBySourceType(key))
                    .collect(Collectors.toList());
            knowledgeSources.put(key, processed);
        });
        
        log.info("领导班子名单知识检索完成 - 企业: {}条, 法规: {}条, 案例: {}条", 
                 knowledgeSources.get("enterprise").size(),
                 knowledgeSources.get("regulation").size(),
                 knowledgeSources.get("auditCase").size());
        
        return knowledgeSources;
    }

    /**
     * 构建增强的领导班子名单查询词
     */
    private List<String> buildEnhancedLeaderListQueries() {
        return Arrays.asList(
            "领导班子 领导成员 任职文件 任命通知",
            "党组 党委 支部 书记 委员 党组成员",
            "董事长 总经理 财务总监 部门负责人",
            "职务任免 职责分工 工作分工 岗位职责",
            "组织机构 人员编制 干部名册 管理人员",
            "党内职务 行政职务 任职时间 任期",
            "公司治理 管理架构 组织架构",
            "工作职责 主要责任 分管工作",
            "干部任免 人事任命 组织任命",
            "管理层 决策层 执行层"
        );
    }

    /**
     * 构建完整的知识上下文 - 优化提示
     */
    private String buildCompleteKnowledgeContext(Map<String, List<String>> knowledgeSources, String history, String suggestion) {
        StringBuilder context = new StringBuilder();
        
        // 1. 领导班子名单分析要求 - 增强要求
        context.append("## 领导班子名单分析要求\n");
        context.append("请基于以下知识生成完整详细的领导班子名单数据：\n\n");
        context.append("1. 必须生成完整的领导班子成员信息，包括党组织领导班子、行政领导班子、各部门负责人等\n");
        context.append("2. 从企业单位知识库中提取所有实际的领导班子成员信息，要求全面完整\n");
        context.append("3. 重点关注领导成员的姓名、单位、部门、党内职务、行政职务、任职期间、工作职责等信息\n");
        context.append("4. 确保信息的准确性和完整性，每个字段都要填写具体内容\n");
        context.append("5. 工作底稿索引必须准确对应实际文件名称，可以包含多个相关文件\n");
        context.append("6. 要求生成尽可能多、尽可能完整的领导班子成员记录，覆盖各个管理层级\n\n");
        
        // 2. 数据格式要求
        context.append("## 数据格式要求\n");
        context.append("需要生成完整详细的领导班子名单数据：\n\n");
        context.append(AuditContent1LeaderListConstants.DATA_FORMAT_REQUIREMENT);
        context.append("\n\n重要要求：\n");
        context.append("1. 必须根据知识库内容生成尽可能多、尽可能完整的领导班子成员信息\n");
        context.append("2. 工作底稿索引必须准确对应实际文件名称，避免使用附表或章节标题\n");
        context.append("3. 任职期间格式统一为：YYYY.MM-YYYY.MM 或 YYYY.MM-至今\n");
        context.append("4. 主要工作责任要具体明确，不能笼统描述\n");
        context.append("5. 部门信息要具体，如：董事会、经理层、财务部、生产部等\n");
        context.append("6. 备注信息可以包含任命方式、试用期等特殊说明\n\n");
        
        // 3. 历史内容
        if (StrUtil.isNotBlank(history)) {
            context.append("## 历史生成内容\n");
            context.append("以下是之前生成的内容，请基于此进行优化和补充：\n");
            context.append(history).append("\n\n");
        }
        
        // 4. 用户建议
        if (StrUtil.isNotBlank(suggestion)) {
            context.append("## 用户优化建议\n");
            context.append("请根据以下建议对生成内容进行调整：\n");
            context.append(suggestion).append("\n\n");
        }
        
        // 5. 企业单位知识
        if (!knowledgeSources.get("enterprise").isEmpty()) {
            context.append("## 企业单位知识\n");
            context.append("这是企业单位的相关制度文件和信息，请仔细分析并提取所有领导班子成员信息：\n");
            knowledgeSources.get("enterprise").forEach(knowledge -> 
                context.append(knowledge).append("\n"));
            context.append("\n");
        }
        
        // 6. 法律法规知识
        if (!knowledgeSources.get("regulation").isEmpty()) {
            context.append("## 法律法规知识\n");
            knowledgeSources.get("regulation").forEach(knowledge -> 
                context.append(knowledge).append("\n"));
            context.append("\n");
        }
        
        // 7. 审计案例知识
        if (!knowledgeSources.get("auditCase").isEmpty()) {
            context.append("## 审计案例知识\n");
            knowledgeSources.get("auditCase").forEach(knowledge -> 
                context.append(knowledge).append("\n"));
        }
        
        log.debug("构建的知识上下文长度: {}", context.length());
        return context.toString();
    }

    /**
     * 领导班子名单相关性比较器
     */
    private int leaderListComparator(String content1, String content2) {
        int score1 = calculateLeaderListRelevanceScore(content1);
        int score2 = calculateLeaderListRelevanceScore(content2);
        return Integer.compare(score2, score1);
    }

    /**
     * 计算领导班子名单相关性分数
     */
    private int calculateLeaderListRelevanceScore(String content) {
        return AuditContent1LeaderListConstants.KEYWORD_WEIGHTS.entrySet().stream()
                .filter(entry -> content.contains(entry.getKey()))
                .mapToInt(Map.Entry::getValue)
                .sum();
    }

    private int getLimitBySourceType(String sourceType) {
        switch (sourceType) {
            case "enterprise": return 100;
            case "regulation": return 50;
            case "auditCase": return 30;
            default: return 50;
        }
    }
}
