import { asc, eq } from 'drizzle-orm';
import { db } from '@/db';
import { leads, leadFotos, leadNotas, leadPipelineEventos } from '@/db/schema';
import type { Lead } from '@/db/schema';
import { getTenantPerfilById } from '@/db/tenant-queries';
import { señalarGeneracionPerfil } from '@/lib/webhooks';

type Tipo = NonNullable<Lead['tipoReforma']>;

// Construye el JSON "bien hecho" con toda la data acumulada del lead agrupada por zona y lo manda
// al flujo externo para que genere los renders "después" y homologue el texto con su agente.
// Best-effort: devuelve true solo si el webhook respondió ok. Deja traza en el pipeline.
export async function señalarPerfilCompleto(leadId: string): Promise<boolean> {
  const [lead] = await db.select().from(leads).where(eq(leads.id, leadId)).limit(1);
  if (!lead) return false;

  const [fotos, notas, tenant] = await Promise.all([
    db.select().from(leadFotos).where(eq(leadFotos.leadId, leadId)).orderBy(asc(leadFotos.orden)),
    db.select().from(leadNotas).where(eq(leadNotas.leadId, leadId)).orderBy(asc(leadNotas.createdAt)),
    getTenantPerfilById(lead.tenantId),
  ]);

  const tipoLead: Tipo = lead.tipoReforma ?? 'otro';
  const zonas = new Map<Tipo, { notas: string[]; antes: string[]; despues: string[] }>();
  const slot = (zona: Tipo) => {
    let s = zonas.get(zona);
    if (!s) {
      s = { notas: [], antes: [], despues: [] };
      zonas.set(zona, s);
    }
    return s;
  };
  for (const f of fotos) slot((f.zona ?? tipoLead) as Tipo)[f.momento].push(f.url);
  for (const n of notas) {
    const t = n.texto.trim();
    if (t) slot((n.zona ?? tipoLead) as Tipo).notas.push(t);
  }

  const payload = {
    leadId,
    cliente: {
      nombre: lead.nombre,
      telefono: lead.telefono,
      email: lead.email,
      provincia: lead.provincia,
    },
    reforma: {
      tipo: lead.tipoReforma,
      m2Suelo: lead.m2Suelo,
      calidad: lead.calidadGlobal,
      estructural: lead.estructural,
      urgencia: lead.urgencia,
      presupuestoTarget: lead.presupuestoTarget,
    },
    empresa: { tenantId: lead.tenantId, nombre: tenant.nombreEmpresa },
    zonas: Array.from(zonas, ([zona, d]) => ({
      zona,
      notas: d.notas,
      fotos: { antes: d.antes, despues: d.despues },
    })),
  };

  const ok = await señalarGeneracionPerfil(payload);

  await db.insert(leadPipelineEventos).values({
    leadId,
    stage: 'render_generado',
    metadata: { perfilCompleto: true, simulado: !ok, zonas: payload.zonas.length },
  });

  return ok;
}
