import { OpenAI } from "openai";
import { Message, getSetting, getLeadByConversationId, searchKnowledgeBase } from "./db";
import { SYSTEM_PROMPT } from "./system-prompt";

// Singleton — se crea una sola vez, no en cada llamada
export const openaiClient = new OpenAI({
  apiKey: process.env.GROQ_API_KEY || "dummy-key",
  baseURL: "https://api.groq.com/openai/v1",
});

export async function generateReply(conversationId: number, history: Message[]): Promise<string> {
  const model = process.env.GROQ_MODEL || "llama-3.3-70b-versatile";

  const chatMessages = history.map((msg) => ({
    role: msg.role === "user" ? ("user" as const) : ("assistant" as const),
    content: msg.content,
  }));

  // 1. Obtener la etapa actual del lead (Default: "Nuevo")
  const lead = getLeadByConversationId(conversationId);
  const stage = lead ? lead.status : "Nuevo";

  // 2. Cargar prompt de etapa o prompt general
  const normalizedStage = stage.replace(/\s+/g, "_");
  let systemPrompt = getSetting(`prompt_stage_${normalizedStage}`, "");
  if (!systemPrompt || systemPrompt.trim() === "") {
    systemPrompt = getSetting("system_prompt", SYSTEM_PROMPT);
  }

  // 3. Buscar información en la base de conocimiento usando el último mensaje del usuario
  const lastUserMsg = [...history].reverse().find(msg => msg.role === "user");
  if (lastUserMsg && lastUserMsg.content) {
    const relevantSnippets = searchKnowledgeBase(lastUserMsg.content, 3);
    if (relevantSnippets.length > 0) {
      systemPrompt += `\n\n[INFORMACIÓN DE RESPALDO DE TU BASE DE CONOCIMIENTO (Úsala para responder al usuario si es relevante. No inventes datos que no estén aquí)]:\n${relevantSnippets.join("\n---\n")}`;
    }
  }

  try {
    const response = await openaiClient.chat.completions.create({
      model: model,
      messages: [
        { role: "system", content: systemPrompt },
        ...chatMessages,
      ],
      temperature: 0.7,
      max_tokens: 200,
    });
    return response.choices[0]?.message?.content?.trim() || "";
  } catch (err: any) {
    console.error("[LLM] Error en Groq:", err?.message || err);
    throw err;
  }
}
