import { openaiClient } from "./ai";
import { getRecentHistory, upsertLead } from "./db";

export async function extractAndSaveLead(conversationId: number, phone: string): Promise<void> {
  const model = process.env.GROQ_MODEL || "llama-3.3-70b-versatile";

  try {
    // 1. Obtener el historial reciente de la conversación (últimos 15 mensajes)
    const history = getRecentHistory(conversationId, 15);
    if (history.length === 0) return;

    // 2. Formatear la conversación para el prompt
    const chatText = history
      .map((msg) => `${msg.role === "user" ? "Cliente" : "Asistente"}: ${msg.content}`)
      .join("\n");

    const systemPrompt = `
Eres un extractor de datos especializado. Tu objetivo es analizar el chat de WhatsApp proporcionado y extraer información comercial clave de la agencia de turismo.
Debes devolver ÚNICAMENTE un objeto JSON con la siguiente estructura. Si un dato no se menciona en la conversación, asígnale el valor null.

Campos a extraer:
- name: Nombre propio de la persona que habla (ej: "Juan", "Alejandra").
- email: Dirección de correo electrónico de la persona o agencia.
- agency_name: Nombre comercial de la agencia de turismo (ej: "Tours Valparaíso", "Sur Viajes").
- current_system: Sistema actual que utilizan para gestionar sus reservas (ej: "Excel", "papel", "ninguno", "sytemX").
- booking_volume: Cantidad aproximada de reservas mensuales o tamaño de la agencia (ej: "50/mes", "100 reservas al mes", "30 semanales").

Tu respuesta debe ser exclusivamente el JSON, sin explicaciones ni texto adicional.
Ejemplo de salida esperada:
{
  "name": "Francisco",
  "email": "contacto@surtours.cl",
  "agency_name": "SurTours",
  "current_system": "Excel",
  "booking_volume": "120/mes"
}
`.trim();

    // 3. Llamar a la API de Groq usando formato de respuesta JSON
    const response = await openaiClient.chat.completions.create({
      model: model,
      messages: [
        { role: "system", content: systemPrompt },
        { role: "user", content: `Por favor analiza esta conversación y extrae los datos:\n\n${chatText}` }
      ],
      response_format: { type: "json_object" },
      temperature: 0.1,
    });

    const rawJson = response.choices[0]?.message?.content?.trim();
    if (!rawJson) return;

    const parsed = JSON.parse(rawJson);

    // 4. Si la IA logró extraer al menos un campo que no sea nulo, guardamos/actualizamos el lead
    const hasData =
      (parsed.name && parsed.name.toLowerCase() !== "null") ||
      (parsed.email && parsed.email.toLowerCase() !== "null") ||
      (parsed.agency_name && parsed.agency_name.toLowerCase() !== "null") ||
      (parsed.current_system && parsed.current_system.toLowerCase() !== "null") ||
      (parsed.booking_volume && parsed.booking_volume.toLowerCase() !== "null");

    if (hasData) {
      upsertLead({
        conversation_id: conversationId,
        phone,
        name: parsed.name && parsed.name.toLowerCase() !== "null" ? parsed.name : null,
        email: parsed.email && parsed.email.toLowerCase() !== "null" ? parsed.email : null,
        agency_name: parsed.agency_name && parsed.agency_name.toLowerCase() !== "null" ? parsed.agency_name : null,
        current_system: parsed.current_system && parsed.current_system.toLowerCase() !== "null" ? parsed.current_system : null,
        booking_volume: parsed.booking_volume && parsed.booking_volume.toLowerCase() !== "null" ? parsed.booking_volume : null,
        status: "Nuevo",
      });
      console.log(`[leads-extractor] Lead procesado y guardado para la conversación ${conversationId}`);
    }
  } catch (err: any) {
    console.error("[leads-extractor] Error al extraer lead:", err?.message || err);
  }
}
