import { createClient } from '@supabase/supabase-js';
const URL='http://127.0.0.1:54321';
const ANON=process.env.SUPABASE_ANON_KEY || process.env.VITE_SUPABASE_ANON_KEY || '';
const REST='11111111-1111-1111-1111-111111111111';
const anon = createClient(URL, ANON, {auth:{persistSession:false}});
let fallos=0; const check=(c,m)=>{console.log((c?'  OK  ':'  XX  ')+m); if(!c)fallos++;};

const { data: prods } = await anon.from('productos').select('id').eq('restaurante_id', REST).limit(1);
const { data: cr, error: ce } = await anon.rpc('crear_pedido', {
  p_restaurante_id: REST, p_cliente_nombre:'Cliente GPS', p_cliente_telefono:'0414-5551122',
  p_tipo_entrega:'delivery', p_metodo_pago:'efectivo',
  p_items:[{producto_id:prods[0].id, cantidad:1}],
  p_direccion:'Av. Principal, casa 5, Guanare', p_direccion_lat:9.045, p_direccion_lng:-69.75 });
if(ce){console.log('crear err', ce.message); process.exit(1);}
const pid = cr[0].pedido_id;

const dueno = createClient(URL, ANON, {auth:{persistSession:false}});
await dueno.auth.signInWithPassword({ email:'dueno@laesquina.com', password:'Dueno1234' });
for (const st of ['confirmado','preparando','listo']) {
  const { error } = await dueno.rpc('cambiar_estado_pedido', { p_pedido_id: pid, p_nuevo_estado: st });
  if(error){console.log('avance err '+st, error.message); process.exit(1);}
}

const rep = createClient(URL, ANON, {auth:{persistSession:false}});
const { error: le } = await rep.auth.signInWithPassword({ email:'repartidor@laesquina.com', password:'Moto1234' });
if(le){console.log('login rep err', le.message); process.exit(1);}

const { data: mp } = await rep.rpc('mi_perfil_repartidor');
check(mp?.[0]?.restaurante_nombre?.includes('Esquina'), 'mi_perfil_repartidor devuelve su restaurante');

await rep.rpc('cambiar_disponibilidad', { p_disponible: false });
let { data: mp2 } = await rep.rpc('mi_perfil_repartidor');
check(mp2?.[0]?.estado==='offline', 'puede ponerse fuera de linea');
await rep.rpc('cambiar_disponibilidad', { p_disponible: true });
({ data: mp2 } = await rep.rpc('mi_perfil_repartidor'));
check(mp2?.[0]?.estado==='disponible', 'puede volver en linea');

const { data: disp } = await rep.rpc('entregas_disponibles');
check(disp.some(d=>d.pedido_id===pid), 'la entrega aparece como disponible');
check(disp.every(d=>d.restaurante_nombre?.includes('Esquina')), 'solo ve entregas de SU restaurante (aislamiento)');

const { data: tk, error: te } = await rep.rpc('tomar_pedido', { p_pedido_id: pid });
check(!te && tk==='en_camino', 'toma la entrega -> en_camino'+(te?': '+te.message:''));

const { data: disp2 } = await rep.rpc('entregas_disponibles');
check(!disp2.some(d=>d.pedido_id===pid), 'tras tomarla ya no aparece como disponible');

const { data: activas } = await rep.from('pedidos').select('id,estado,cliente_telefono').eq('estado','en_camino');
const mine=activas.find(p=>p.id===pid);
  check(!!mine && (mine.cliente_telefono||'').length>0, 'la ve en sus activas con el telefono del cliente');

const { error: te2 } = await rep.rpc('tomar_pedido', { p_pedido_id: pid });
check(!!te2, 'un segundo intento de tomar el mismo pedido se rechaza (atomico)');

const { error: ee } = await rep.rpc('cambiar_estado_pedido', { p_pedido_id: pid, p_nuevo_estado: 'entregado' });
check(!ee, 'marca entregado'+(ee?': '+ee.message:''));
const { data: mp3 } = await rep.rpc('mi_perfil_repartidor');
check(mp3?.[0]?.estado==='disponible', 'tras entregar vuelve a disponible');

console.log('\n'+(fallos===0?'REPARTIDOR OK':fallos+' FALLO(S)')); process.exit(fallos===0?0:1);
