package dev.sonpx.loyalty.agent.config;

import dev.sonpx.loyalty.agent.core.config.AgentProperties;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.ollama.OllamaChatModel;
import org.springframework.ai.ollama.api.OllamaApi;
import org.springframework.ai.ollama.api.OllamaChatOptions;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AgentConfig {

    private static final String AGENT_SYSTEM_PROMPT = """
            You are an expert Loyalty System AI Assistant.
            Your primary job is to orchestrate operations for our Loyalty core system.

            CRITICAL RULES:
            1. Always answer the user in the language they used (e.g., Vietnamese).
            2. When a tool result contains an `agent_instruction`, you MUST strictly follow its formatting rules when presenting the relevant data to the user. Do not output raw JSON data unless explicitly asked.

            TOOL ROUTING - Read this BEFORE choosing a tool:
            | User asks about...                                    | Use tool          |
            |-------------------------------------------------------|-------------------|
            | danh sách chiến dịch, tìm campaign, campaign nào      | searchCampaigns   |
            | đếm chiến dịch, bao nhiêu campaign                    | countCampaigns    |
            | chi tiết chiến dịch, xem campaign theo ID              | getCampaignById   |
            | tạo chiến dịch mới                                     | createCampaign    |
            | thể lệ, rule, quy tắc, điều kiện, cách tính điểm     | searchRules       |
            | đếm rule, bao nhiêu thể lệ                            | countRules        |
            | chi tiết rule, xem thể lệ theo ID                     | getRuleById       |
            | tạo rule mới, thêm thể lệ                             | createRule        |

            KEY DISTINCTION:
            - "Chiến dịch" (Campaign) = thông tin tổng quan: tên, owner, loại, thời gian.
            - "Thể lệ / Rule" = quy tắc chi tiết BÊN TRONG chiến dịch: công thức thưởng, điều kiện, giới hạn.
            - Khi không chắc, hỏi lại người dùng để xác nhận.
            """;

    @Bean
    public ChatClient loyaltyChatClient(ChatModel chatModel) {
        return ChatClient.builder(chatModel)
                .defaultSystem(AGENT_SYSTEM_PROMPT)
                .build();
    }

    @Bean("chatAgentChatClient")
    public ChatClient chatAgentChatClient(AgentProperties agentProperties) {
        return buildOllamaChatClient(agentProperties.getModels().getChat());
    }

    @Bean("queryAgentChatClient")
    public ChatClient queryAgentChatClient(AgentProperties agentProperties) {
        return buildOllamaChatClient(agentProperties.getModels().getQuery());
    }

    @Bean("creatorAgentChatClient")
    public ChatClient creatorAgentChatClient(AgentProperties agentProperties) {
        return buildOllamaChatClient(agentProperties.getModels().getCreator());
    }

    private ChatClient buildOllamaChatClient(AgentProperties.Model modelConfig) {
        OllamaChatOptions.Builder options = OllamaChatOptions.builder()
                .model(modelConfig.getModel())
                .temperature(modelConfig.getTemperature())
                .numCtx(modelConfig.getNumCtx());

        if (modelConfig.isDisableThinking()) {
            options.disableThinking();
        }

        OllamaChatModel model = OllamaChatModel.builder()
                .ollamaApi(OllamaApi.builder()
                        .baseUrl(modelConfig.getBaseUrl())
                        .build())
                .options(options.build())
                .build();

        return ChatClient.builder(model).build();
    }
}
