// Verificacion de 2 de los 4 arreglos pedidos por Gilberto (backend):
// 01: abrir_mesa guarda nombre de referencia tambien en modo 'unica'.
// 04: crear_pedido acepta 'punto_venta' como metodo de pago.
// (02 y 03 son solo interfaz, se verifican con capturas de pantalla).
// Usa el restaurante DEMO, mesas TF90/TF91, un staff temporal, y 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;
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 MESA_UNICA = 'TF90';
const MESA_SEPARADA = 'TF91';

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.fixes@gustitoxpress.app';
const CLAVE = 'FixesTest2026!';
let staffUid;
let pedidoPuntoVenta;

const limpiar = async () => {
  for (const mesa of [MESA_UNICA, MESA_SEPARADA]) {
    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').update({ cuenta_id: null }).eq('cuenta_id', c.id);
      await svc.from('cuentas_mesa').delete().eq('id', c.id);
    }
  }
  if (pedidoPuntoVenta) await svc.from('pedidos').delete().eq('id', pedidoPuntoVenta);
  if (staffUid) await svc.auth.admin.deleteUser(staffUid).catch(() => {});
};

try {
  await limpiar();
  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 Fixes Test' });

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

  // --- 01: modo 'unica' con nombre de referencia ---
  const { data: cuentaUnicaId, error: eUnica } = await staff.rpc('abrir_mesa', {
    p_mesa: MESA_UNICA,
    p_comensales: 3,
    p_modo: 'unica',
    p_nombres: ['Familia Test'],
  });
  check(!eUnica && !!cuentaUnicaId, 'abrir_mesa en modo unica con nombre funciona' + (eUnica ? ' -> ' + eUnica.message : ''));
  const { data: comUnica } = await svc.from('comensales_mesa').select('*').eq('cuenta_id', cuentaUnicaId);
  check((comUnica ?? []).length === 1 && comUnica[0].nombre === 'Familia Test', 'modo unica guarda EXACTAMENTE 1 comensal con el nombre de referencia');

  // --- 01 (regresion): modo 'separada' sigue funcionando igual que antes ---
  const { data: cuentaSepId, error: eSep } = await staff.rpc('abrir_mesa', {
    p_mesa: MESA_SEPARADA,
    p_comensales: 2,
    p_modo: 'separada',
    p_nombres: ['Pedro', 'Ana'],
  });
  check(!eSep && !!cuentaSepId, 'abrir_mesa en modo separada sigue funcionando' + (eSep ? ' -> ' + eSep.message : ''));
  const { data: comSep } = await svc.from('comensales_mesa').select('nombre').eq('cuenta_id', cuentaSepId).order('orden');
  check((comSep ?? []).length === 2 && comSep[0].nombre === 'Pedro' && comSep[1].nombre === 'Ana', 'modo separada sigue guardando los N nombres, sin regresion');

  // --- 04: crear_pedido acepta punto_venta ---
  if (PROD_ID) {
    const { data: creado, 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: 'mesa',
      p_metodo_pago: 'punto_venta',
      p_items: [{ producto_id: PROD_ID, cantidad: 1 }],
      p_mesa: MESA_UNICA,
    });
    check(!ePV && !!creado?.[0]?.pedido_id, 'crear_pedido acepta metodo_pago=punto_venta' + (ePV ? ' -> ' + ePV.message : ''));
    pedidoPuntoVenta = creado?.[0]?.pedido_id;
    const { data: pedFila } = await svc.from('pedidos').select('metodo_pago').eq('id', pedidoPuntoVenta).maybeSingle();
    check(pedFila?.metodo_pago === 'punto_venta', 'el pedido queda guardado con metodo_pago=punto_venta');
  } else {
    check(false, 'demo sin productos disponibles para probar punto_venta');
  }
} catch (e) {
  console.log('  XX  Excepción: ' + e.message);
  fallos++;
} finally {
  await limpiar();
  console.log('\nLimpieza hecha (cuentas, comensales, pedido y usuario de prueba fuera)');
}

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