import { eq } from 'drizzle-orm';
import { db } from '@/db';
import { leads, leadPipelineEventos } from '@/db/schema';
import { construirPresupuestoPdf } from '@/lib/pdf/build-presupuesto';
import { enviarPresupuestoEmail } from '@/lib/email/mailer';
import { notificarFlujoWhatsapp } from '@/lib/webhooks';
import { resolveTheme } from '@/lib/funnel/themes';
import { normalizarTelefonoEs } from '@/lib/voice/retell';

export type ResultadoFinalizar = {
  ok: boolean;
  emailEnviado: boolean;
  whatsappSenal: boolean;
};

// Cierra el funnel de un lead cuando ya están las imágenes "después": arma el PDF con la galería
// por zona, lo persiste, lo envía SIEMPRE por email y manda la señal de entrega por WhatsApp al
// flujo externo. Entrega real (la rama simulada de orchestrator.ts:Paso 7 es solo el estado
// intermedio del funnel). Best-effort en email/WhatsApp: el lead avanza igualmente.
export async function finalizarYEntregar(leadId: string): Promise<ResultadoFinalizar> {
  const pdf = await construirPresupuestoPdf(leadId);
  if (!pdf) return { ok: false, emailEnviado: false, whatsappSenal: false };

  const { buffer, filename, lead, tenant } = pdf;
  const pdfBase64 = buffer.toString('base64');

  await db
    .update(leads)
    .set({ pdfUrl: `data:application/pdf;base64,${pdfBase64}`, updatedAt: new Date() })
    .where(eq(leads.id, leadId));

  // Marca del reformista para el acento del email + CTA de contacto (WhatsApp o email).
  const theme = resolveTheme(tenant.themePreset, tenant.themeColor);
  const tel = tenant.telefono ? normalizarTelefonoEs(tenant.telefono) : null;
  const cta = tel
    ? { url: `https://wa.me/${tel.replace('+', '')}`, label: 'Agendar mi visita gratuita' }
    : tenant.email
      ? { url: `mailto:${tenant.email}`, label: 'Agendar mi visita gratuita' }
      : null;

  const [emailEnviado, whatsappSenal] = await Promise.all([
    enviarPresupuestoEmail({
      to: lead.email,
      nombre: lead.nombre,
      empresa: tenant.nombreEmpresa,
      pdf: buffer,
      filename,
      brand: {
        primary: theme.primary,
        primaryDark: theme.primaryDark,
        contrast: theme.contrast,
        logoUrl: tenant.logoUrl,
      },
      cta,
    }),
    notificarFlujoWhatsapp({
      leadId,
      telefono: lead.telefono,
      nombre: lead.nombre,
      empresa: tenant.nombreEmpresa,
      pdfBase64,
      filename,
    }),
  ]);

  await db
    .update(leads)
    .set({
      pipelineStage: 'whatsapp_entregado',
      estado: 'presupuesto_enviado',
      updatedAt: new Date(),
    })
    .where(eq(leads.id, leadId));

  await db.insert(leadPipelineEventos).values({
    leadId,
    stage: 'whatsapp_entregado',
    metadata: {
      via: [emailEnviado ? 'email' : null, whatsappSenal ? 'whatsapp' : null].filter(Boolean),
      emailEnviado,
      simulado: !emailEnviado && !whatsappSenal,
    },
  });

  return { ok: true, emailEnviado, whatsappSenal };
}
