// Verifica la bandera "para llevar" de un pedido de mesa contra la BD viva:
// se marca SOLO en pedidos de mesa, cuenta_mesa lo expone por pedido, y un
// pickup NO lo hereda (para llevar solo aplica a mesa). Demo, mesas T80/T81.
// Env: SUPABASE_URL, SUPABASE_ANON_KEY, SUPABASE_SERVICE_KEY.
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;
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 anon = 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 limpiar = async () => {
  for (const mesa of ['T80', 'T81']) {
    const { data: ctas } = await svc.from('cuentas_mesa').select('id').eq('restaurante_id', REST).eq('mesa', mesa);
    for (const c of ctas ?? []) {
      await svc.from('pedidos').delete().eq('cuenta_id', c.id);
      await svc.from('cuentas_mesa').delete().eq('id', c.id);
    }
  }
  // El pickup de prueba no tiene cuenta; se borra por telefono marca.
  await svc.from('pedidos').delete().eq('restaurante_id', REST).eq('cliente_telefono', '0000llevar');
};

const pedir = async (extra) => {
  const { data, error } = await anon.rpc('crear_pedido', {
    p_restaurante_id: REST,
    p_cliente_nombre: 'Prueba Llevar',
    p_cliente_telefono: '0000llevar',
    p_metodo_pago: 'efectivo',
    p_items: [{ producto_id: PROD_ID, cantidad: 1 }],
    ...extra,
  });
  if (error) throw new Error('crear_pedido: ' + error.message);
  return data[0];
};

try {
  await limpiar();

  // ===== Mesa T80 con para_llevar = true =====
  const r1 = await pedir({ p_tipo_entrega: 'mesa', p_mesa: 'T80', p_para_llevar: true });
  const { data: ped1 } = await svc.from('pedidos').select('para_llevar,cuenta_id').eq('id', r1.pedido_id).maybeSingle();
  check(ped1?.para_llevar === true, 'Pedido de mesa marcado PARA LLEVAR queda para_llevar=true');
  const { data: ct1 } = await anon.rpc('cuenta_mesa', { p_cuenta_id: r1.cuenta_id });
  const pj1 = (ct1?.[0]?.pedidos ?? []).find((p) => p.codigo === r1.codigo);
  check(pj1?.para_llevar === true, 'cuenta_mesa expone para_llevar=true en ese pedido');

  // ===== Mesa T81 normal (para comer aqui) =====
  const r2 = await pedir({ p_tipo_entrega: 'mesa', p_mesa: 'T81' });
  const { data: ped2 } = await svc.from('pedidos').select('para_llevar').eq('id', r2.pedido_id).maybeSingle();
  check(ped2?.para_llevar === false, 'Pedido de mesa normal queda para_llevar=false');
  const { data: ct2 } = await anon.rpc('cuenta_mesa', { p_cuenta_id: r2.cuenta_id });
  const pj2 = (ct2?.[0]?.pedidos ?? []).find((p) => p.codigo === r2.codigo);
  check(pj2?.para_llevar === false, 'cuenta_mesa expone para_llevar=false en el normal');

  // ===== Pickup con para_llevar=true NO lo hereda (solo aplica a mesa) =====
  const r3 = await pedir({ p_tipo_entrega: 'pickup', p_para_llevar: true });
  const { data: ped3 } = await svc.from('pedidos').select('para_llevar,tipo_entrega').eq('id', r3.pedido_id).maybeSingle();
  check(ped3?.para_llevar === false, 'Un pickup NO marca para_llevar (ya es de por si para llevar)');
} catch (e) {
  console.log('  XX  Excepción: ' + e.message);
  fallos++;
} finally {
  await limpiar();
  console.log('\nLimpieza hecha');
}

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