// Auditoria de aislamiento multi-tenant: ningun restaurante ve datos de otro.
// Crea dos negocios (Pedro y Jose), pone un pedido en cada uno y verifica que
// cada dueno solo ve/toca lo suyo.
import { createClient } from '@supabase/supabase-js';
const URL = process.env.VITE_SUPABASE_URL || 'http://127.0.0.1:54321';
const ANON =
  process.env.VITE_SUPABASE_ANON_KEY || process.env.SUPABASE_ANON_KEY || '';
let fallos = 0;
const check = (c, m) => {
  console.log((c ? '  OK  ' : '  XX  ') + m);
  if (!c) fallos++;
};
const nuevo = () => createClient(URL, ANON, { auth: { persistSession: false } });

let contador = 0;
async function crearNegocio(nombre) {
  const c = nuevo();
  contador++;
  const email = `dueno.aisl.${Date.now()}.${contador}@ff.test`;
  const su = await c.auth.signUp({ email, password: 'Test1234' });
  if (su.error) throw new Error('signup ' + nombre + ': ' + su.error.message);
  const { data: cr, error } = await c.rpc('crear_restaurante', { p_nombre: nombre });
  if (error) throw new Error('crear ' + nombre + ': ' + error.message);
  const restId = cr[0].restaurante_id;
  const cat = await c.from('categorias').insert({ restaurante_id: restId, nombre: 'Pizzas', orden: 1 }).select().single();
  const prod = await c
    .from('productos')
    .insert({ restaurante_id: restId, categoria_id: cat.data.id, nombre: 'Pizza', precio_usd: 8, disponible: true })
    .select()
    .single();
  await c.from('restaurantes').update({ publicado: true }).eq('id', restId);
  return { cliente: c, restId, slug: cr[0].slug, prodId: prod.data.id };
}

const pedro = await crearNegocio('Pizzeria Pedro');
const jose = await crearNegocio('Pizzeria Jose');
check(pedro.slug !== jose.slug, `Slugs distintos: ${pedro.slug} / ${jose.slug}`);

const anon = nuevo();
async function pedir(neg, nombre) {
  const { data, error } = await anon.rpc('crear_pedido', {
    p_restaurante_id: neg.restId,
    p_cliente_nombre: nombre,
    p_cliente_telefono: '04141234567',
    p_tipo_entrega: 'pickup',
    p_metodo_pago: 'efectivo',
    p_items: [{ producto_id: neg.prodId, cantidad: 1 }],
  });
  if (error) throw new Error('pedir: ' + error.message);
  return data[0].pedido_id;
}
const pedidoPedro = await pedir(pedro, 'Cliente de Pedro');
const pedidoJose = await pedir(jose, 'Cliente de Jose');

// Cada dueno solo ve SU pedido
const { data: verPedro } = await pedro.cliente.from('pedidos').select('id,cliente_nombre');
check(verPedro?.length === 1 && verPedro[0].id === pedidoPedro, `Pedro ve SOLO su pedido (${verPedro?.length})`);
const { data: verJose } = await jose.cliente.from('pedidos').select('id');
check(verJose?.length === 1 && verJose[0].id === pedidoJose, `Jose ve SOLO su pedido (${verJose?.length})`);

// Pedro NO puede leer el pedido de Jose por id
const { data: fuga } = await pedro.cliente.from('pedidos').select('id').eq('id', pedidoJose).maybeSingle();
check(!fuga, 'Pedro NO puede leer el pedido de Jose por id');

// Pedro NO puede cambiarle el estado al pedido de Jose
const { error: eHack } = await pedro.cliente.rpc('cambiar_estado_pedido', { p_pedido_id: pedidoJose, p_nuevo_estado: 'confirmado' });
check(!!eHack, 'Pedro NO puede cambiar el pedido de Jose (sin permiso)');

// Pedro solo ve SU pago
const { data: pagosPedro } = await pedro.cliente.from('pagos').select('id');
check(pagosPedro?.length === 1, `Pedro ve SOLO su pago (${pagosPedro?.length})`);

console.log('\n' + (fallos === 0 ? 'AISLAMIENTO OK — ningun restaurante cruza datos' : `${fallos} FALLO(S)`));
process.exit(fallos === 0 ? 0 : 1);
