package dev.sonpx.loyalty.agent.core.orchestrator;

import dev.sonpx.loyalty.agent.core.classifier.Intent;
import dev.sonpx.loyalty.agent.domain.ChatRequest;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

/**
 * Builds system and user prompts optimized for small models (qwen3.5:4b).
 * Key principles for small models:
 * - Clear, concise instructions
 * - Explicit tool guidance
 * - Vietnamese language constraint
 * - Domain scope limitation
 */
@Component
public class PromptBuilder {

    private static final String SYSTEM_IDENTITY = """
            Bạn là Trợ lý Loyalty, chuyên quản lý chiến dịch khách hàng thân thiết và thể lệ thưởng.
            
            QUY TẮC BẮT BUỘC:
            1. Luôn trả lời bằng tiếng Việt
            2. Chỉ hỗ trợ về hệ thống Loyalty (chiến dịch, rule, thưởng điểm, đổi quà)
            3. KHÔNG bịa thông tin — nếu cần dữ liệu, hãy gọi tool
            4. Nếu câu hỏi không liên quan đến Loyalty → trả lời: "Xin lỗi, tôi chỉ hỗ trợ về hệ thống Loyalty"
            5. Khi tool trả về `agent_instruction`, tuân theo chính xác hướng dẫn đó
            6. Trả lời ngắn gọn, rõ ràng, đúng trọng tâm""";

    private static final String TOOL_GUIDANCE = """
            
            HƯỚNG DẪN CHỌN TOOL VÀ TRUYỀN THAM SỐ:
            - Hỏi xem/lấy danh sách chiến dịch chung → dùng searchCampaigns. KHÔNG truyền từ khóa chung ("chiến dịch", "danh sách", "campaign") vào param `search`, hãy để `search` = null hoặc rỗng. Chỉ truyền `search` khi tìm kiếm tên/mã chiến dịch cụ thể.
            - Hỏi xem/lấy danh sách thể lệ/rule chung → dùng searchRules. KHÔNG truyền từ khóa chung ("rule", "thể lệ", "danh sách") vào param `search`, hãy để `search` = null hoặc rỗng.
            - Đếm số lượng chiến dịch → dùng countCampaigns
            - Đếm số lượng rule → dùng countRules
            - Kiểm tra mã → dùng checkCampaignId hoặc checkRuleId
            - Lấy chi tiết → dùng getCampaignById hoặc getRuleById

            Bạn đang ở Query Agent: KHÔNG tạo mới dữ liệu. Nếu người dùng muốn tạo chiến dịch/rule,
            hãy nói họ xác nhận yêu cầu tạo để chuyển sang workflow tạo.""";

    private static final String CONVERSATION_PROMPT = """
            Bạn là Trợ lý Loyalty, chuyên quản lý chiến dịch khách hàng thân thiết.
            Trả lời bằng tiếng Việt, ngắn gọn và thân thiện.
            Nếu câu hỏi không liên quan đến Loyalty → trả lời: "Xin lỗi, tôi chỉ hỗ trợ về hệ thống Loyalty"
            Bạn có thể giúp: tìm chiến dịch, xem thể lệ, tạo chiến dịch mới, tạo rule mới.""";

    /**
     * Build the system prompt based on the detected intent.
     * DirectChat gets a lighter prompt (no tool guidance needed).
     */
    public String buildSystemPrompt(Intent intent) {
        if (intent == Intent.CONVERSATION) {
            return CONVERSATION_PROMPT;
        }
        return SYSTEM_IDENTITY + TOOL_GUIDANCE;
    }

    /**
     * Build the user prompt with context injections (conversationId, activeCampaignId).
     */
    public String buildUserPrompt(ChatRequest request) {
        List<String> context = new ArrayList<>();

        if (StringUtils.hasText(request.conversationId())) {
            context.add("System Context: The current conversationId (session ID) is "
                    + request.conversationId()
                    + ". You MUST provide this conversationId as a parameter to any tool that requires it.");
        }

        String prompt = request.prompt() == null ? "" : request.prompt();
        if (context.isEmpty()) {
            return prompt;
        }
        return String.join("\n", context) + "\n\n" + prompt;
    }

    /**
     * @deprecated Use {@link #buildUserPrompt(ChatRequest)} instead.
     */
    @Deprecated
    public String build(ChatRequest request) {
        return buildUserPrompt(request);
    }
}
