package com.infoepoch.pms.agent.domain.itworkbench.understanding;

import com.infoepoch.pms.agent.common.utils.LogHelper;
import com.infoepoch.pms.agent.domain.care.log.CareTraceLogSupport;
import com.infoepoch.pms.agent.domain.itworkbench.enums.WorkbenchIntent;
import com.infoepoch.pms.agent.domain.itworkbench.model.WorkbenchConversationState;
import com.infoepoch.pms.agent.observability.ai.AiModelInvoker;
import com.infoepoch.pms.agent.observability.ai.AiObservationContext;
import com.infoepoch.pms.agent.observability.ai.AiObservationSupport;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

@Service
public class WorkbenchIntentRecognizer {

    private final ChatModel chatModel;
    private final AiModelInvoker aiModelInvoker;
    private final AiObservationSupport observationSupport;

    public WorkbenchIntentRecognizer(
            @Qualifier("SiliconFlowChatModel") ChatModel chatModel,
            AiModelInvoker aiModelInvoker,
            AiObservationSupport observationSupport) {
        this.chatModel = chatModel;
        this.aiModelInvoker = aiModelInvoker;
        this.observationSupport = observationSupport;
    }


    public WorkbenchIntent recognize(String traceId, String sessionId, String message, WorkbenchConversationState state) {
        String trimMsg = StringUtils.hasText(message) ? message.trim() : "";

        // ====================== 【终极核心】 ======================
        // 判断：用户是不是要【重新查一个新业务】
        boolean isNewQuery = isNewBusinessQuery(trimMsg);

        // 如果是【全新查询】→ 不继承任何东西！直接重新识别！
        if (isNewQuery) {
            LogHelper.info(this, CareTraceLogSupport.format(
                    traceId, sessionId, "意图识别", "用户发起新业务查询 → 不继承上下文，重新识别"
            ));
            return doClassify(traceId, sessionId, trimMsg);
        }

        // ====================== 多轮对话：沿用上次意图 ======================
        if (state != null && state.lastIntent() != null) {
            WorkbenchIntent lastIntent = state.lastIntent();
            if (!WorkbenchIntent.GENERAL_CHAT.equals(lastIntent)) {
                LogHelper.info(this, CareTraceLogSupport.format(
                        traceId, sessionId, "意图识别 (多轮)", 
                        "消息=[" + trimMsg + "] isNewQuery=" + isNewQuery + " 沿用意图：" + lastIntent
                ));
                return lastIntent;
            } else {
                LogHelper.info(this, CareTraceLogSupport.format(
                        traceId, sessionId, "意图识别 (多轮)", 
                        "消息=[" + trimMsg + "] 上次是 GENERAL_CHAT，重新识别"
                ));
            }
        }

        // 全新会话 或 上次是 GENERAL_CHAT
        LogHelper.info(this, CareTraceLogSupport.format(
                traceId, sessionId, "意图识别", 
                "消息=[" + trimMsg + "] state=" + (state == null ? "null" : "exist") + " 重新识别"
        ));
        return doClassify(traceId, sessionId, trimMsg);
    }

    /**
     * 【关键判断】
     * 只要包含这些词 = 用户要查【新业务】，必须清空上下文！
     * 排除全量查询关键词（全量/全部/所有/重置/清除）
     */
    public boolean isNewBusinessQuery(String message) {
        if (!StringUtils.hasText(message)) return false;
        String m = message.toLowerCase();
        
        // 如果包含全量查询关键词，不视为新业务（避免误判）
        if (m.contains("全量") || m.contains("全部") || m.contains("所有") 
            || m.contains("重置") || m.contains("清除")) {
            return false;
        }
        
        return
                   m.contains("kpi")
                || m.contains("绩效")
                || m.contains("指标")
                || m.contains("工作")
                || m.contains("任务")
                || m.contains("会议")
                || m.contains("纪要")
                || m.contains("督办")
                || m.contains("跟踪");
    }

    /**
     * 执行意图识别
     */
    private WorkbenchIntent doClassify(String traceId, String sessionId, String message) {
        String prompt = """
        你是员工看板智能体意图分类器。
        请严格按照规则判断，只输出英文枚举名称，不要输出任何其他内容，不要解释。

        【严格分类规则】
        1. QUERY_DEPARTMENT_WORK
           匹配：重点工作、重点任务、部门工作、月度工作、周工作、日常工作、工作计划
           不包含：KPI、绩效、指标、会议

        2. QUERY_ANNUAL_KPI
           匹配：KPI、年度 KPI、上月 KPI、本月 KPI、季度 KPI、绩效、指标
           只要提到 KPI / 绩效 / 指标，必须优先返回这个类型

        3. QUERY_DEPARTMENT_MINUTES
           匹配：会议纪要、会议跟踪、督办、会议落实

        4. GENERAL_CHAT
           以上都不包含的内容

        只返回枚举值：
        QUERY_DEPARTMENT_WORK
        QUERY_ANNUAL_KPI
        QUERY_DEPARTMENT_MINUTES
        GENERAL_CHAT

        用户输入：%s
        """.formatted(message);

        AiObservationContext ctx = observationSupport.currentContext().toBuilder()
                .traceId(traceId)
                .sessionId(sessionId)
                .scene("员工看板意图识别")
                .componentName("workbench.intent.recognizer")
                .build();

        String result = aiModelInvoker.call(ctx, prompt, chatModel);
        if (result == null) return WorkbenchIntent.GENERAL_CHAT;

        try {
            return WorkbenchIntent.valueOf(result.trim().toUpperCase());
        } catch (Exception e) {
            return WorkbenchIntent.GENERAL_CHAT;
        }
    }
}
