import { env, retellConfigurado } from '@/lib/env';
import { TIPO_LABEL } from '@/lib/funnel';
import type { Lead } from '@/db/schema';

const CREATE_PHONE_CALL_URL = 'https://api.retellai.com/v2/create-phone-call';

// Normaliza un teléfono español a E.164 (+34XXXXXXXXX), que es lo que exige Retell.
// Acepta espacios, guiones, paréntesis y los prefijos +34 / 0034 / 34 ya puestos.
export function normalizarTelefonoEs(raw: string): string | null {
  const limpio = raw.replace(/[\s\-().]/g, '');
  if (/^\+[1-9]\d{7,14}$/.test(limpio)) return limpio;
  if (/^0034\d{9}$/.test(limpio)) return `+${limpio.slice(2)}`;
  if (/^34\d{9}$/.test(limpio)) return `+${limpio}`;
  if (/^[6789]\d{8}$/.test(limpio)) return `+34${limpio}`;
  return null;
}

export type VariablesLlamada = Record<string, string>;

// Dynamic variables que el agente de Retell inserta en su prompt ({{empresa_nombre}}, etc.).
// Solo los datos que el script "habla": empresa y nombre de pila del cliente; tipo de reforma
// y provincia van como contexto opcional para que el agente confirme en vez de preguntar a frío.
export function construirVariablesLlamada(
  empresa: { nombreEmpresa: string },
  lead: Pick<Lead, 'nombre' | 'tipoReforma' | 'provincia'>,
): VariablesLlamada {
  const vars: VariablesLlamada = {
    empresa_nombre: empresa.nombreEmpresa,
    cliente_nombre: lead.nombre.split(' ')[0],
  };
  if (lead.tipoReforma) vars.tipo_reforma = TIPO_LABEL[lead.tipoReforma].toLowerCase();
  if (lead.provincia) vars.provincia = lead.provincia;
  return vars;
}

export type ResultadoLlamada = { callId: string };

// Inicia una llamada saliente con el agente de Retell. Best-effort para la demo (Arquitectura A):
// el POST vuelve en cuanto Retell acepta la llamada (el móvil del lead empieza a sonar) y el
// pipeline continúa generando el entregable. Si Retell no está configurado, el teléfono no es
// válido o la API falla, devuelve null y NO lanza — el funnel sigue en modo simulado.
export async function iniciarLlamadaSaliente(opts: {
  telefono: string;
  variables: VariablesLlamada;
}): Promise<ResultadoLlamada | null> {
  if (!retellConfigurado()) return null;

  const toNumber = normalizarTelefonoEs(opts.telefono);
  if (!toNumber) return null;

  const body: Record<string, unknown> = {
    from_number: env.RETELL_FROM_NUMBER,
    to_number: toNumber,
    retell_llm_dynamic_variables: opts.variables,
  };
  if (env.RETELL_AGENT_ID) body.override_agent_id = env.RETELL_AGENT_ID;

  try {
    const res = await fetch(CREATE_PHONE_CALL_URL, {
      method: 'POST',
      headers: {
        Authorization: `Bearer ${env.RETELL_API_KEY}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify(body),
    });
    if (!res.ok) {
      console.error(`Retell create-phone-call ${res.status}: ${await res.text()}`);
      return null;
    }
    const data = (await res.json()) as { call_id?: string };
    return data.call_id ? { callId: data.call_id } : null;
  } catch (err) {
    console.error('Retell create-phone-call error:', err);
    return null;
  }
}
