import type { APIRoute } from "astro";
import { appendRegistrationToSheet } from "../lib/googleSheets";
import { sendEmailCf } from "../lib/email";
import { saveFormularioToSupabase, emailExistsInDb } from "../lib/formularioDb";
export const prerender = false;

const COLUMNS = [
  "aceptacion_reglamento",
  "nombre_completo",
  "apellido",
  "documentos",
  "correo",
  "reglamento_firma",
  "fecha_nacimiento",
  "nacionalidad",
  "sexo",
  "direccion_completa",
  "direccion_postal",
  "ciudad",
  "estado",
  "pais",
  "postal",
  "telefono",
  "whatsapp",
  "profesion",
  "lugar_trabajo_actual",
  "nivel_academico",
  "idioma",
  "idioma_nivel_Espanol",
  "idioma_nivel_Ingles",
  "idioma_nivel_Hebreo",
  "idioma_nivel_Portugues",
  "idioma_nivel_Otro",
  "idioma_otro",
  "voluntariado_anterior",
  "caso_si",
  "areas_colaborar",
  "areas_otra",
  "dias_disponibles",
  "horario_preferido",
  "fuera_ciudad",
  "misiones_internacionales",
  "condicion_medica",
  "condicion_medica_cual",
  "alergias",
  "medicamentos",
  "emergencia_nombre",
  "emergencia_parentesco",
  "emergencia_telefono",
  "emergencia_correo",
  "confirmar_nombre",
  "confirmar_firma",
  "declaracion_voluntario",
  "confirmacion",
  "locale",
];

function flattenValue(val: unknown): string {
  if (Array.isArray(val)) {
    return val.join(", ");
  }
  if (val === null || val === undefined) {
    return "";
  }
  return String(val);
}

export const POST: APIRoute = async ({ request }) => {
  try {
    const body = await request.json();
    const formData = body.formData || {};

    const honeypot = body.honeypot || "";
    if (honeypot) {
      return Response.json(
        { success: false, message: "Solicitud rechazada" },
        { status: 403 }
      );
    }

    const turnstileToken = body.turnstileToken || "";
    const turnstileSecret = process.env.TURNSTILE_SECRET_KEY;
    if (turnstileSecret && turnstileToken) {
      const verify = await fetch(
        "https://challenges.cloudflare.com/turnstile/v0/siteverify",
        {
          method: "POST",
          headers: { "Content-Type": "application/x-www-form-urlencoded" },
          body: `secret=${turnstileSecret}&response=${turnstileToken}`,
        }
      );
      const outcome = await verify.json();
      if (!outcome.success) {
        return Response.json(
          { success: false, message: "Captcha inválido" },
          { status: 403 }
        );
      }
    }

    const timestamp = new Date().toLocaleString("es-ES", {
      timeZone: "America/Puerto_Rico",
    });

    const exists = await emailExistsInDb(formData.correo);
    if (exists) {
      return Response.json(
        { success: false, message: "Este correo ya está registrado. No se permiten 2 registros." },
        { status: 409 }
      );
    }

    const form = await saveFormularioToSupabase(
      formData,
      body.responses || []
    );

    const row = COLUMNS.map((key) => flattenValue(formData[key]));
    row.push(timestamp);

    const result = await appendRegistrationToSheet(row);

    await sendEmailCf({
      nombres: formData.nombre_completo,
      apellidos: formData.apellido,
    }, formData.correo, "CENTRO_DEL_REINO_PAZ_Y_JUSTICIA_POSTULACION");

    return Response.json({
      ...result,
      numero_voluntario: form.numero_voluntario,
    });
  } catch (error) {
    console.error("Error en /api/formulario/send:", error);
    return Response.json(
      {
        success: false,
        message: error instanceof Error ? error.message : "Error al enviar el formulario",
      },
      { status: 500 }
    );
  }
};
