package com.infoepoch.pms.agent.platform.agent.domain.service;

import com.infoepoch.pms.agent.platform.agent.domain.Agent;
import com.infoepoch.pms.agent.platform.agent.domain.AgentField;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.util.List;

/**
 * 动态 System Prompt 生成器。
 * <p>
 * 若智能体配置了自定义 systemPrompt 则以其为基础；
 * 否则根据 Agent 名称、描述和字段列表自动拼装标准提示词。
 * 两种路径都会追加 submit 工具使用约束。
 * </p>
 */
@Component
public class SystemPromptGenerator {

    private static final String SUBMIT_GUIDANCE = "所有必填字段收集完毕后，调用 submit 工具提交申请\n"
            + "严格根据 submit 工具返回结果回复用户：提交成功后告知用户申请已提交，"
            + "提交失败时，根据 submit 工具返回的失败原因向用户说明";

    /**
     * 生成子 ReactAgent 的 system prompt。
     *
     * @param agent 智能体实体（需已加载 fields 集合）
     * @return 生成的 system prompt 字符串
     */
    public String generate(Agent agent) {
        String prompt = StringUtils.hasText(agent.getSystemPrompt())
                ? agent.getSystemPrompt()
                : buildDefaultPrompt(agent);
        return appendSubmitGuidance(prompt);
    }

    /**
     * 根据智能体信息自动构建默认 system prompt。
     *
     * @param agent 智能体实体
     * @return 默认 system prompt
     */
    private String buildDefaultPrompt(Agent agent) {
        StringBuilder sb = new StringBuilder();
        sb.append("你是「").append(agent.getName()).append("」，");
        sb.append(agent.getDescription()).append("\n\n");
        sb.append("你需要收集以下信息：\n");

        if (!CollectionUtils.isEmpty(agent.getFields())) {
            sb.append(buildFieldPrompt(agent.getFields()));
        }
        return sb.toString();
    }

    /**
     * 根据智能体字段列表构建已填充的 system prompt。
     *
     * @param fields 智能体附属字段列表
     * @return 字段定义段落文本
     */
    private String buildFieldPrompt(List<AgentField> fields) {
        StringBuilder sb = new StringBuilder();
        for (AgentField field : fields) {
            sb.append("- ").append(field.getFieldLabel())
                    .append("（").append(field.getFieldName()).append("）")
                    .append("：").append(field.getFieldType()).append("，");

            sb.append(field.isRequired() ? "必填" : "选填");

            if ("date".equals(field.getFieldType()) || "datetime".equals(field.getFieldType())) {
                if (StringUtils.hasText(field.getDateFormat())) {
                    sb.append("，格式：").append(field.getDateFormat());
                }
            }

            if ("enum".equals(field.getFieldType()) && field.getEnumOptions() != null
                    && !field.getEnumOptions().isEmpty()) {
                sb.append("，可选值：").append(field.getEnumOptions());
            }

            if (StringUtils.hasText(field.getDescription())) {
                sb.append("，说明：").append(field.getDescription());
            }

            sb.append("\n");
        }

        sb.append("\n收集规则：\n");
        sb.append("1. 缺少必填字段时，每次只追问一个字段，语气自然友好\n");
        sb.append("2. 日期类字段需将用户输入转换为指定格式\n");

        return sb.toString();
    }

    /**
     * 在系统提示词末尾追加 submit 工具使用约束。
     *
     * @param prompt 原始提示词
     * @return 追加约束后的提示词
     */
    private String appendSubmitGuidance(String prompt) {
        return prompt + "\n\n" + SUBMIT_GUIDANCE;
    }
}
