// Verifica el fix pedido por Gilberto: al tomar un pedido desde el panel
// (mostrador/delivery) con Pago Movil/Transferencia/Zelle, la referencia se
// guarda en pagos.referencia. Efectivo/punto_venta NO deben exigir ni guardar
// referencia (no aplica). Usa el restaurante DEMO, un staff temporal, LIMPIA todo.
import { createClient } from '@supabase/supabase-js';

const URL = process.env.SUPABASE_URL || process.env.VITE_SUPABASE_URL;
const ANON = process.env.SUPABASE_ANON_KEY || process.env.VITE_SUPABASE_ANON_KEY;
const SERVICE = process.env.SUPABASE_SERVICE_KEY || process.env.SUPABASE_SERVICE_ROLE_KEY;
if (!URL || !ANON || !SERVICE) {
  console.log('Faltan SUPABASE_URL / SUPABASE_ANON_KEY / SUPABASE_SERVICE_KEY');
  process.exit(1);
}

let fallos = 0;
const check = (cond, msg) => {
  console.log((cond ? '  OK  ' : '  XX  ') + msg);
  if (!cond) fallos++;
};
const nuevo = () => createClient(URL, ANON, { auth: { persistSession: false } });
const svc = createClient(URL, SERVICE, { auth: { persistSession: false } });

const { data: rest } = await svc.from('restaurantes').select('id,abierto').eq('slug', 'demo-gustito').maybeSingle();
if (!rest?.id || !rest.abierto) {
  console.log('Demo no disponible');
  process.exit(1);
}
const REST = rest.id;
const { data: prods } = await svc.from('productos').select('id').eq('restaurante_id', REST).eq('disponible', true).limit(1);
const PROD_ID = prods?.[0]?.id;

const EMAIL = 'staff.test.referencia@gustitoxpress.app';
const CLAVE = 'RefTest2026!';
let staffUid;
const pedidosCreados = [];

const limpiar = async () => {
  for (const id of pedidosCreados) {
    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);
  }
  if (staffUid) await svc.auth.admin.deleteUser(staffUid).catch(() => {});
};

try {
  await limpiar();
  if (!PROD_ID) throw new Error('Demo sin productos disponibles');

  const { data: u, error: eU } = await svc.auth.admin.createUser({ email: EMAIL, password: CLAVE, email_confirm: true });
  if (eU) throw new Error('createUser: ' + eU.message);
  staffUid = u.user.id;
  await svc.from('perfiles').upsert({ id: staffUid, rol: 'staff', restaurante_id: REST, nombre: 'Staff Referencia Test' });

  const staff = nuevo();
  await staff.auth.signInWithPassword({ email: EMAIL, password: CLAVE });

  // --- Pago Movil CON referencia: debe guardarse en pagos.referencia ---
  const { data: pm, error: ePm } = await staff.rpc('crear_pedido', {
    p_restaurante_id: REST,
    p_cliente_nombre: 'Cliente Mostrador Test',
    p_cliente_telefono: '04120001111',
    p_tipo_entrega: 'pickup',
    p_metodo_pago: 'pago_movil',
    p_items: [{ producto_id: PROD_ID, cantidad: 1 }],
    p_referencia: '00123456789',
  });
  check(!ePm && !!pm?.[0]?.pedido_id, 'crear_pedido con pago_movil + referencia funciona' + (ePm ? ' -> ' + ePm.message : ''));
  if (pm?.[0]?.pedido_id) pedidosCreados.push(pm[0].pedido_id);
  const { data: pagoPm } = await svc.from('pagos').select('referencia,metodo').eq('pedido_id', pm?.[0]?.pedido_id).maybeSingle();
  check(pagoPm?.referencia === '00123456789', `la referencia queda guardada en pagos.referencia (vino: ${pagoPm?.referencia})`);

  // --- Efectivo: la referencia se ignora aunque se mande (no aplica) ---
  const { data: ef, error: eEf } = await staff.rpc('crear_pedido', {
    p_restaurante_id: REST,
    p_cliente_nombre: 'Cliente Efectivo Test',
    p_cliente_telefono: '04120002222',
    p_tipo_entrega: 'pickup',
    p_metodo_pago: 'efectivo',
    p_items: [{ producto_id: PROD_ID, cantidad: 1 }],
    p_referencia: 'no deberia guardarse nada raro si se manda igual',
  });
  check(!eEf && !!ef?.[0]?.pedido_id, 'crear_pedido con efectivo sigue funcionando' + (eEf ? ' -> ' + eEf.message : ''));
  if (ef?.[0]?.pedido_id) pedidosCreados.push(ef[0].pedido_id);

  // --- Punto de venta SIN referencia (no la necesita): debe quedar null ---
  const { data: pv, error: ePv } = await staff.rpc('crear_pedido', {
    p_restaurante_id: REST,
    p_cliente_nombre: 'Cliente Punto Venta Test',
    p_cliente_telefono: '04120003333',
    p_tipo_entrega: 'pickup',
    p_metodo_pago: 'punto_venta',
    p_items: [{ producto_id: PROD_ID, cantidad: 1 }],
  });
  check(!ePv && !!pv?.[0]?.pedido_id, 'crear_pedido con punto_venta sin referencia sigue funcionando' + (ePv ? ' -> ' + ePv.message : ''));
  if (pv?.[0]?.pedido_id) pedidosCreados.push(pv[0].pedido_id);
  const { data: pagoPv } = await svc.from('pagos').select('referencia').eq('pedido_id', pv?.[0]?.pedido_id).maybeSingle();
  check(pagoPv?.referencia === null, `punto_venta sin referencia queda null (vino: ${JSON.stringify(pagoPv?.referencia)})`);

  // --- Referencia con espacios en blanco -> se guarda como null (nullif+trim) ---
  const { data: pm2, error: ePm2 } = await staff.rpc('crear_pedido', {
    p_restaurante_id: REST,
    p_cliente_nombre: 'Cliente Referencia Vacia Test',
    p_cliente_telefono: '04120004444',
    p_tipo_entrega: 'pickup',
    p_metodo_pago: 'transferencia',
    p_items: [{ producto_id: PROD_ID, cantidad: 1 }],
    p_referencia: '   ',
  });
  check(!ePm2 && !!pm2?.[0]?.pedido_id, 'crear_pedido con transferencia + referencia en blanco funciona' + (ePm2 ? ' -> ' + ePm2.message : ''));
  if (pm2?.[0]?.pedido_id) pedidosCreados.push(pm2[0].pedido_id);
  const { data: pagoPm2 } = await svc.from('pagos').select('referencia').eq('pedido_id', pm2?.[0]?.pedido_id).maybeSingle();
  check(pagoPm2?.referencia === null, `referencia en blanco se normaliza a null (vino: ${JSON.stringify(pagoPm2?.referencia)})`);
} catch (e) {
  console.log('  XX  Excepción: ' + e.message);
  fallos++;
} finally {
  await limpiar();
  console.log('\nLimpieza hecha (pedidos, pagos y usuario de prueba fuera)');
}

console.log(fallos === 0 ? '\nREFERENCIA PAGO POS OK' : `\nREFERENCIA PAGO POS: ${fallos} FALLO(S)`);
process.exit(fallos === 0 ? 0 : 1);
