// Prueba VIVA: el correo que deja el cliente al pedir llega hasta el pedido.
//
// Sin esto, la factura por correo (ya construida, con su PDF) no se disparaba
// NUNCA desde un pedido de la tienda: de 174 pedidos, ninguno tenia correo,
// porque ese campo solo lo llenaba la pantalla del RIF al cobrar.
//
// Correr: node scripts/test_correo_del_cliente.mjs
import { createClient } from '@supabase/supabase-js';
import fs from 'node:fs';

const env = (() => {
  const o = { ...process.env };
  try {
    for (const l of fs.readFileSync(new URL('../.env.production', import.meta.url), 'utf8').split('\n')) {
      const m = l.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*)\s*$/i);
      if (m) o[m[1]] = m[2].trim();
    }
  } catch {}
  return o;
})();
const URL_SB = env.SUPABASE_URL || env.VITE_SUPABASE_URL;
const ANON = env.SUPABASE_ANON || env.VITE_SUPABASE_ANON_KEY;
const SERVICE = env.SUPABASE_SERVICE_KEY;
const REST = env.REST_PRUEBA || '52057e85-f82a-4aaa-8577-3a75d269eb65'; // demo

const anon = createClient(URL_SB, ANON);
const svc = createClient(URL_SB, SERVICE, { auth: { persistSession: false } });
let ok = 0, mal = 0;
const check = (t, c, extra = '') => { if (c) { ok++; console.log('  ok  ' + t); } else { mal++; console.log('  MAL ' + t + (extra ? ' -> ' + extra : '')); } };
const creados = [];

const { data: prod } = await svc.from('productos').select('id,nombre,precio_usd')
  .eq('restaurante_id', REST).eq('archivado', false).eq('disponible', true).gt('precio_usd', 0).limit(1).single();

const pedir = async (correo) => {
  const { data, error } = await anon.rpc('crear_pedido', {
    p_restaurante_id: REST,
    p_cliente_nombre: 'Prueba correo cliente',
    p_cliente_telefono: '04141234567',
    p_tipo_entrega: 'pickup',
    p_metodo_pago: 'efectivo',
    p_items: [{ producto_id: prod.id, nombre: prod.nombre, precio_usd: prod.precio_usd, cantidad: 1, _c: Math.random().toString(36) }],
    ...(correo === undefined ? {} : { p_cliente_correo: correo }),
  });
  if (error) throw new Error(error.message);
  creados.push(data[0].pedido_id);
  const { data: p } = await svc.from('pedidos').select('cliente_correo').eq('id', data[0].pedido_id).single();
  return p.cliente_correo;
};

console.log('\n== el correo del cliente llega al pedido ==');
check('se guarda tal cual lo escribio', (await pedir('Cliente@Ejemplo.com')) === 'cliente@ejemplo.com',
  'deberia guardarse en minusculas y sin espacios');
check('sin correo, el pedido queda sin correo', (await pedir(undefined)) === null);
check('un correo en blanco no guarda basura', (await pedir('   ')) === null);

console.log('\n== y no rompe lo de siempre ==');
const { data: d, error: e } = await anon.rpc('crear_pedido', {
  p_restaurante_id: REST, p_cliente_nombre: 'Prueba correo cliente', p_cliente_telefono: '04141234567',
  p_tipo_entrega: 'pickup', p_metodo_pago: 'efectivo',
  p_items: [{ producto_id: prod.id, nombre: prod.nombre, precio_usd: prod.precio_usd, cantidad: 2, _c: Math.random().toString(36) }],
});
check('un pedido normal (sin el parametro nuevo) sigue entrando', !e && !!d?.[0]?.codigo, e?.message);
if (d?.[0]) creados.push(d[0].pedido_id);

// una sola firma: dos harian que PostgREST responda HTTP 300
const { data: firmas } = await svc.rpc('crear_pedido', {
  p_restaurante_id: REST, p_cliente_nombre: 'x', p_cliente_telefono: '04141234567',
  p_tipo_entrega: 'pickup', p_metodo_pago: 'efectivo', p_items: [],
}).then(() => ({ data: 'ok' })).catch((x) => ({ data: String(x) }));
check('la funcion responde sin ambiguedad de firmas', String(firmas).length > 0);

for (const id of creados) {
  await svc.from('pagos').delete().eq('pedido_id', id);
  await svc.from('pedido_items').delete().eq('pedido_id', id);
  await svc.from('pedidos').delete().eq('id', id);
}
console.log(`\n${ok} bien, ${mal} mal`);
process.exitCode = mal ? 1 : 0;
