package org.dromara.knowledge.generation;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.exception.ServiceException;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

/**
 * 默认响应生成器实现
 * 基于检索到的上下文和查询生成响应
 *
 * @author pengles
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class DefaultGenerator implements Generator {

    @Override
    public String generate(String query, String context, Map<String, Object> options) {
        if (query == null || query.trim().isEmpty()) {
            throw new ServiceException("查询内容不能为空");
        }

        // 构建提示词
        String prompt = buildPrompt(query, context, options);

        // 这里可以根据 options 中的配置选择不同的生成策略
        // 例如：调用 LLM API、使用模板生成等
        // 当前实现为简单拼接，实际应用中应该调用 LLM 服务

        log.debug("生成响应，查询: {}, 上下文长度: {}", query, context != null ? context.length() : 0);

        // 简单的模板生成（实际应该调用 LLM）
        return generateSimpleResponse(query, context);
    }

    /**
     * 构建提示词
     */
    private String buildPrompt(String query, String context, Map<String, Object> options) {
        StringBuilder promptBuilder = new StringBuilder();

        // 系统提示
        String systemPrompt = getOption(options, "systemPrompt", 
            "你是一个知识库助手，基于提供的上下文回答问题。如果上下文中没有相关信息，请说明。");
        promptBuilder.append(systemPrompt).append("\n\n");

        // 上下文
        if (context != null && !context.trim().isEmpty()) {
            promptBuilder.append("上下文：\n").append(context).append("\n\n");
        }

        // 查询
        promptBuilder.append("问题：").append(query).append("\n\n");
        promptBuilder.append("回答：");

        return promptBuilder.toString();
    }

    /**
     * 简单响应生成（占位实现）
     * 实际应用中应该调用 LLM API
     */
    private String generateSimpleResponse(String query, String context) {
        if (context == null || context.trim().isEmpty()) {
            return "抱歉，我无法在知识库中找到相关信息来回答您的问题。";
        }

        // 简单的摘要生成（实际应该使用 LLM）
        // 这里只是占位实现，实际应该调用 LLM 服务
        return String.format("基于提供的上下文，相关内容如下：\n\n%s\n\n这是对您问题 '%s' 的回答。", 
            context.substring(0, Math.min(context.length(), 500)), query);
    }

    /**
     * 从选项 Map 中获取值
     */
    @SuppressWarnings("unchecked")
    private <T> T getOption(Map<String, Object> options, String key, T defaultValue) {
        if (options == null) {
            return defaultValue;
        }
        Object value = options.get(key);
        return value != null ? (T) value : defaultValue;
    }

    /**
     * 生成响应（带默认选项）
     */
    public String generate(String query, String context) {
        return generate(query, context, new HashMap<>());
    }
}
