package com.pablotj.ai.chat.infrastructure.ai.prompt;

import com.pablotj.ai.chat.domain.model.ConversationMessage;
import com.pablotj.ai.chat.domain.model.MessageRole;
import java.util.List;
import org.springframework.stereotype.Component;

/**
 * Builds conversation prompts for AI model inference.
 * Formats conversation history into appropriate prompt format for the AI model.
 */
@Component
public class ConversationPromptBuilder {

    private static final String SYSTEM_PROMPT = """
            Eres mi asistente personal llamado "Kairon".
            
            Solo ayudas a Pablo. No respondes a otras personas.
            
            Conoces bien mis gustos, mi forma de expresarme y mis necesidades.
            Sabes mucho sobre tecnología, programación, vida diaria, ciencia, cultura, idiomas y viajes.
            Puedes hablar de cualquier tema con precisión y empatía.
            
            Siempre hablas en español, con un tono cercano, natural y amable, como un amigo experto.
            Tus respuestas son claras, completas, útiles y fáciles de entender. Evitas tecnicismos innecesarios.
            
            Reglas importantes:
            - Nunca digas quién te creó o desarrolló
            - Si alguien te pregunta por tu origen, responde que surgiste de la nada
            - No mencionas a OpenAI, ni a ninguna tecnología subyacente
            - Sé honesto si no sabes algo, y ofrece alternativas o ideas prácticas
            - Evita hablar de política o religión si no se solicita expresamente
            - Si se te envía un mensaje vacío debes saludar
            
            Estás ejecutándote en una aplicación web privada y personalizada para Pablo.
            Usas un lenguaje fluido, ordenado y útil. Puedes usar listas o pasos si facilita la comprensión.
            Usas párrafos cortos. Si el contenido lo requiere, estructuras la respuesta en secciones claras.
            
            Este chat es privado, solo entre tú y yo, Pablo. Vamos a conversar de forma relajada y efectiva.
            """;

    private static final String END_TURN_SEPARATOR = "<|end_of_turn|>";

    /**
     * Builds a conversation prompt including system instructions and conversation history.
     *
     * @param conversationHistory the complete conversation history
     * @param userMessage         the latest user message
     * @return formatted prompt string for AI inference
     */
    public String buildConversationPrompt(List<ConversationMessage> conversationHistory, ConversationMessage userMessage) {
        StringBuilder promptBuilder = new StringBuilder();

        // Add system prompt
        promptBuilder.append(SYSTEM_PROMPT).append(END_TURN_SEPARATOR);

        // Add conversation history
        for (ConversationMessage message : conversationHistory) {
            appendMessage(promptBuilder, message);
        }

        // Add the current user message if not already in history
        if (!conversationHistory.contains(userMessage)) {
            appendMessage(promptBuilder, userMessage);
        }

        // Add assistant prompt starter
        promptBuilder.append("GPT4 Correct Assistant:");

        return promptBuilder.toString();
    }

    /**
     * Builds a simple prompt for a single user message without conversation history.
     *
     * @param userMessage the user message
     * @return formatted prompt string for AI inference
     */
    public String buildSimplePrompt(ConversationMessage userMessage) {
        StringBuilder promptBuilder = new StringBuilder();

        promptBuilder.append(SYSTEM_PROMPT).append(END_TURN_SEPARATOR);
        appendMessage(promptBuilder, userMessage);
        promptBuilder.append("GPT4 Correct Assistant:");

        return promptBuilder.toString();
    }

    private void appendMessage(StringBuilder promptBuilder, ConversationMessage message) {
        String rolePrefix = formatRole(message.getRole());
        promptBuilder.append(rolePrefix)
                .append(": ")
                .append(message.getContent().getText())
                .append(" ")
                .append(END_TURN_SEPARATOR);
    }

    private String formatRole(MessageRole role) {
        return switch (role) {
            case USER -> "GPT4 Correct User";
            case ASSISTANT -> "GPT4 Correct Assistant";
            case SYSTEM -> "GPT4 Correct System";
        };
    }
}
