// LA VERIFICACION PUBLICA DEL SERIAL.
//
// Cualquiera (un cliente firmando contrato, un fiscal, un curioso) mete el
// serial de una Estacion y la nube dice si esta registrada con esta imprenta,
// a nombre de quien, y si esta ACTIVA o SUSPENDIDA. Es el candado comercial:
// nadie puede decir "yo uso este servicio" sin un serial que verifique.
//
// El freno vive en la base (10 consultas por hora por direccion): el serial es
// correlativo y sin freno cualquiera enumera la cartera de clientes.
interface Entorno {
  SUPABASE_URL: string;
  SUPABASE_SERVICE_KEY: string;
}

function json(datos: unknown, estado = 200): Response {
  return new Response(JSON.stringify(datos), {
    status: estado,
    headers: { 'content-type': 'application/json; charset=utf-8', 'cache-control': 'no-store' },
  });
}

export const onRequestGet: PagesFunction<Entorno> = async (ctx) => {
  const url = new URL(ctx.request.url);
  const serial = (url.searchParams.get('serial') ?? '').trim();
  if (!serial || serial.length > 12) return json({ registrada: false, motivo: 'serial_invalido' });

  const desde = ctx.request.headers.get('cf-connecting-ip') ?? 'desconocida';
  const r = await fetch(`${ctx.env.SUPABASE_URL}/rest/v1/rpc/fn_verificar_estacion`, {
    method: 'POST',
    headers: {
      apikey: ctx.env.SUPABASE_SERVICE_KEY,
      Authorization: `Bearer ${ctx.env.SUPABASE_SERVICE_KEY}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ p_serial: serial, p_desde: desde }),
  });

  if (!r.ok) {
    const detalle = (await r.json().catch(() => ({}))) as { message?: string };
    if (/Demasiadas consultas/i.test(detalle.message ?? '')) {
      return json({ error: 'Demasiadas consultas desde tu conexion. Intenta mas tarde.' }, 429);
    }
    return json({ error: 'No se pudo verificar en este momento.' }, 500);
  }
  return json(await r.json());
};
