'use server';

import { db } from '@/db';
import { testimonios, testimonioFotos } from '@/db/schema';
import { getLeadForReview } from '@/lib/funnel/public-queries';

const MAX_FOTOS = 4;
const MAX_FOTO_BYTES = 6 * 1024 * 1024; // 6 MB por foto

export type EnviarOpinionResult = { ok: boolean; error?: string };

async function fileToDataUri(file: File): Promise<string | null> {
  if (file.size === 0 || file.size > MAX_FOTO_BYTES) return null;
  if (!file.type.startsWith('image/')) return null;
  const buffer = Buffer.from(await file.arrayBuffer());
  return `data:${file.type};base64,${buffer.toString('base64')}`;
}

// El cliente final deja su opinión desde el funnel de review (/opinion/[id]).
// Entra como 'pendiente'; el reformista la aprueba antes de que salga en su landing.
export async function enviarOpinion(
  leadId: string,
  _prev: EnviarOpinionResult | null,
  formData: FormData
): Promise<EnviarOpinionResult> {
  const data = await getLeadForReview(leadId);
  if (!data || !data.tenant) {
    return { ok: false, error: 'No hemos podido identificar tu solicitud.' };
  }
  if (data.yaEnviado) {
    return { ok: false, error: 'Ya hemos recibido tu opinión. ¡Gracias!' };
  }

  const rating = Number(formData.get('rating'));
  if (!Number.isInteger(rating) || rating < 1 || rating > 5) {
    return { ok: false, error: 'Selecciona una valoración de 1 a 5 estrellas.' };
  }

  const texto = String(formData.get('texto') ?? '').trim();
  if (texto.length < 10) {
    return { ok: false, error: 'Cuéntanos un poco más sobre tu experiencia (mínimo 10 caracteres).' };
  }

  const nombre = String(formData.get('nombre') ?? '').trim() || data.lead.nombre;
  const contexto = String(formData.get('contexto') ?? '').trim() || null;

  const archivos = formData.getAll('fotos').filter((f): f is File => f instanceof File);
  const dataUris: string[] = [];
  for (const file of archivos.slice(0, MAX_FOTOS)) {
    const uri = await fileToDataUri(file);
    if (uri) dataUris.push(uri);
  }

  const [testimonio] = await db
    .insert(testimonios)
    .values({
      tenantId: data.tenant.id,
      leadId,
      nombre,
      contexto,
      rating,
      texto,
      estado: 'pendiente',
    })
    .returning({ id: testimonios.id });

  if (dataUris.length > 0) {
    await db.insert(testimonioFotos).values(
      dataUris.map((url, orden) => ({ testimonioId: testimonio.id, url, orden }))
    );
  }

  return { ok: true };
}
