package org.dromara.ai.service;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.ai.domain.dto.AiChatRequest;
import org.dromara.ai.domain.dto.AiChatResponse;
import org.dromara.common.json.utils.JsonUtils;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * AI代码助手服务
 * 提供代码分析、重构建议和项目脚手架生成功能
 *
 * @author pengles
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class AiCodingAssistantService {

    private final AiChatService aiChatService;

    /**
     * 代码分析
     * 提供代码审查、复杂度评估、潜在缺陷分析和重构建议
     *
     * @param code   代码内容
     * @param model  模型名称
     * @param params 额外参数（如语言类型、分析深度等）
     * @param userId 用户ID
     * @return 分析结果
     */
    public AiChatResponse analyzeCode(String code, String model, Map<String, Object> params, String userId) {
        log.info("开始代码分析 - 用户: {}, 代码长度: {}", userId, code != null ? code.length() : 0);

        List<AiChatRequest.AiMessage> messages = new ArrayList<>();

        // 构建系统提示词
        StringBuilder systemPrompt = new StringBuilder();
        systemPrompt.append("你是一位经验丰富的软件工程师和代码审查专家。请对提供的代码进行全面分析，包括：\n");
        systemPrompt.append("1. 代码质量和可读性评估\n");
        systemPrompt.append("2. 潜在缺陷和安全隐患识别\n");
        systemPrompt.append("3. 性能优化建议\n");
        systemPrompt.append("4. 代码复杂度分析\n");
        systemPrompt.append("5. 最佳实践建议\n");
        systemPrompt.append("6. 具体的重构建议和示例代码\n\n");
        systemPrompt.append("请以结构化的方式输出分析结果，包括问题点、严重程度、建议改进方案等。");

        messages.add(new AiChatRequest.AiMessage()
                .setRole("system")
                .setContent(systemPrompt.toString()));

        // 构建用户消息
        StringBuilder userMessage = new StringBuilder();
        if (params != null && params.containsKey("language")) {
            userMessage.append("编程语言: ").append(params.get("language")).append("\n\n");
        }
        userMessage.append("请分析以下代码：\n\n");
        userMessage.append("```\n");
        userMessage.append(code);
        userMessage.append("\n```");

        messages.add(new AiChatRequest.AiMessage()
                .setRole("user")
                .setContent(userMessage.toString()));

        AiChatRequest req = new AiChatRequest()
                .setModel(model != null && !model.isBlank() ? model : "gpt-4")
                .setMessages(messages)
                .setUserId(userId)
                .setTemperature(0.3) // 降低温度以获得更稳定的分析结果
                .setExtra(params != null ? params : new HashMap<>());

        return aiChatService.chat(req);
    }

    /**
     * 生成项目脚手架
     * 根据应用类型和选项生成项目结构和配置
     *
     * @param appType 应用类型（如 SpringBoot、Vue、React 等）
     * @param options 选项（如数据库类型、构建工具等）
     * @param model   模型名称
     * @param userId  用户ID
     * @return 脚手架生成结果
     */
    public AiChatResponse generateScaffold(String appType, Map<String, Object> options, String model, String userId) {
        log.info("开始生成项目脚手架 - 用户: {}, 类型: {}", userId, appType);

        List<AiChatRequest.AiMessage> messages = new ArrayList<>();

        // 构建系统提示词
        StringBuilder systemPrompt = new StringBuilder();
        systemPrompt.append("你是一位经验丰富的全栈架构师。请根据用户需求生成详细的项目脚手架方案，包括：\n");
        systemPrompt.append("1. 完整的项目目录结构（文件树形式）\n");
        systemPrompt.append("2. 关键配置文件的完整内容（如 pom.xml、package.json、application.yml 等）\n");
        systemPrompt.append("3. 依赖列表（包括版本号）\n");
        systemPrompt.append("4. 初始化命令和脚本\n");
        systemPrompt.append("5. README.md 文件内容\n");
        systemPrompt.append("6. 项目架构说明\n\n");
        systemPrompt.append("请以结构化的方式输出，确保所有配置和代码都是可执行的。");

        messages.add(new AiChatRequest.AiMessage()
                .setRole("system")
                .setContent(systemPrompt.toString()));

        // 构建用户消息
        StringBuilder userMessage = new StringBuilder();
        userMessage.append("请为以下需求生成项目脚手架：\n\n");
        userMessage.append("应用类型: ").append(appType).append("\n");

        if (options != null && !options.isEmpty()) {
            userMessage.append("选项配置:\n");
            try {
                userMessage.append(JsonUtils.toJsonString(options));
            } catch (Exception e) {
                options.forEach((key, value) -> userMessage.append("  - ").append(key).append(": ").append(value).append("\n"));
            }
        }

        messages.add(new AiChatRequest.AiMessage()
                .setRole("user")
                .setContent(userMessage.toString()));

        AiChatRequest req = new AiChatRequest()
                .setModel(model != null && !model.isBlank() ? model : "gpt-4")
                .setMessages(messages)
                .setUserId(userId)
                .setTemperature(0.7)
                .setMaxTokens(4000) // 脚手架内容较长，增加token限制
                .setExtra(options != null ? options : new HashMap<>());

        return aiChatService.chat(req);
    }
}
