// Prueba VIVA: el extra de una opcion se cobra segun el GRUPO donde se eligio.
//
// El mismo nombre puede aparecer en dos grupos con precios distintos ("Pernil"
// gratis en "Elige tu proteina (incluida)" y a 1,50 en "Otra proteina?"). Antes
// se buscaba solo por nombre y se sumaban los dos: el cliente veia 11 y pagaba 14.
//
// Correr:  node scripts/test_precio_opciones.mjs
// Necesita SUPABASE_URL / SUPABASE_ANON / SUPABASE_SERVICE_KEY en el entorno
// (o .env.production para las dos primeras).
import { createClient } from '@supabase/supabase-js';
import fs from 'node:fs';

const env = (() => {
  const o = { ...process.env };
  try {
    for (const l of fs.readFileSync(new URL('../.env.production', import.meta.url), 'utf8').split('\n')) {
      const m = l.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*)\s*$/i);
      if (m) o[m[1]] = m[2].trim();
    }
  } catch {}
  return o;
})();

const URL_SB = env.SUPABASE_URL || env.VITE_SUPABASE_URL;
const ANON = env.SUPABASE_ANON || env.VITE_SUPABASE_ANON_KEY;
const SERVICE = env.SUPABASE_SERVICE_KEY;
if (!URL_SB || !ANON || !SERVICE) {
  console.error('Faltan credenciales (SUPABASE_URL / ANON / SERVICE_KEY).');
  process.exitCode = 1;
} else {
  const anon = createClient(URL_SB, ANON);
  const svc = createClient(URL_SB, SERVICE, { auth: { persistSession: false } });

  let ok = 0, mal = 0;
  const check = (t, cond, extra = '') => { if (cond) { ok++; console.log('  ok  ' + t); } else { mal++; console.log('  MAL ' + t + (extra ? ' -> ' + extra : '')); } };
  const creados = [];

  // Producto de prueba propio: dos grupos que repiten nombres a proposito.
  const REST = env.REST_PRUEBA || '52057e85-f82a-4aaa-8577-3a75d269eb65'; // demo
  const { data: cat } = await svc.from('categorias').select('id').eq('restaurante_id', REST).limit(1).single();
  const opciones = [
    { nombre: 'Proteina incluida', tipo: 'single', max: 1, obligatorio: true,
      opciones: [{ nombre: 'Pernil', precio_extra: 0 }, { nombre: 'Tocineta', precio_extra: 0 }] },
    { nombre: 'Otra proteina', tipo: 'multi', max: null, obligatorio: false,
      opciones: [{ nombre: 'Pernil', precio_extra: 1.5 }, { nombre: 'Tocineta', precio_extra: 1.5 }] },
  ];
  const { data: prod, error: ePro } = await svc.from('productos')
    .insert({ restaurante_id: REST, categoria_id: cat.id, nombre: 'ZZ Prueba precio opciones', precio_usd: 5, disponible: true, opciones })
    .select('id').single();
  if (ePro) { console.error('no pude sembrar el producto:', ePro.message); process.exitCode = 1; }

  const pedir = async (item) => {
    const { data, error } = await anon.rpc('crear_pedido', {
      p_restaurante_id: REST,
      p_cliente_nombre: 'Prueba precio opciones',
      p_cliente_telefono: '04141234567',
      p_tipo_entrega: 'pickup',
      p_metodo_pago: 'efectivo',
      p_items: [{ producto_id: prod.id, nombre: 'ZZ', precio_usd: 5, cantidad: 1, _c: Math.random().toString(36), ...item }],
    });
    if (error) throw new Error(error.message);
    creados.push(data[0].pedido_id);
    const { data: it } = await svc.from('pedido_items').select('precio_usd').eq('pedido_id', data[0].pedido_id).single();
    return Number(it.precio_usd);
  };

  console.log('\n== el precio sale del grupo donde se eligio ==');
  // 1. incluida + extra: 5 + 0 + 1,50
  let p = await pedir({
    opciones: ['Pernil', 'Tocineta'],
    opciones_sel: [{ g: 'Proteina incluida', o: 'Pernil' }, { g: 'Otra proteina', o: 'Tocineta' }],
  });
  check('incluida gratis + un extra de 1,50 = 6,50', p === 6.5, `dio ${p}`);

  // 2. solo la incluida: no se cobra nada extra
  p = await pedir({ opciones: ['Pernil'], opciones_sel: [{ g: 'Proteina incluida', o: 'Pernil' }] });
  check('solo la incluida = 5,00', p === 5, `dio ${p}`);

  // 3. el mismo nombre en los dos grupos: se cobra una vez, la del grupo pago
  p = await pedir({
    opciones: ['Pernil'],
    opciones_sel: [{ g: 'Proteina incluida', o: 'Pernil' }, { g: 'Otra proteina', o: 'Pernil' }],
  });
  check('mismo nombre en los dos grupos = 6,50', p === 6.5, `dio ${p}`);

  // 4. dos extras pagos
  p = await pedir({
    opciones: ['Pernil', 'Tocineta'],
    opciones_sel: [{ g: 'Otra proteina', o: 'Pernil' }, { g: 'Otra proteina', o: 'Tocineta' }],
  });
  check('dos extras pagos = 8,00', p === 8, `dio ${p}`);

  console.log('\n== compatibilidad: pantallas viejas que solo mandan nombres ==');
  // 5. sin grupo no se puede saber cual es; nunca cobrar de mas
  p = await pedir({ opciones: ['Pernil', 'Tocineta'] });
  check('sin grupo NO cobra de mas (<= 6,50)', p <= 6.5, `dio ${p}`);
  check('sin grupo tampoco duplica el mismo nombre', p <= 6.5, `dio ${p}`);

  // 6. producto sin opciones sigue igual
  const { data: simple } = await svc.from('productos')
    .insert({ restaurante_id: REST, categoria_id: cat.id, nombre: 'ZZ Prueba sin opciones', precio_usd: 3, disponible: true })
    .select('id').single();
  const { data: d2 } = await anon.rpc('crear_pedido', {
    p_restaurante_id: REST, p_cliente_nombre: 'Prueba precio opciones', p_cliente_telefono: '04141234567',
    p_tipo_entrega: 'pickup', p_metodo_pago: 'efectivo',
    p_items: [{ producto_id: simple.id, nombre: 'ZZ', precio_usd: 3, cantidad: 2, _c: Math.random().toString(36) }],
  });
  creados.push(d2[0].pedido_id);
  const { data: it2 } = await svc.from('pedido_items').select('precio_usd,cantidad').eq('pedido_id', d2[0].pedido_id).single();
  check('producto sin opciones: 3,00 x 2', Number(it2.precio_usd) === 3 && it2.cantidad === 2, `dio ${it2.precio_usd} x ${it2.cantidad}`);

  // limpieza
  for (const id of creados) {
    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);
  }
  await svc.from('productos').delete().eq('id', prod.id);
  await svc.from('productos').delete().eq('id', simple.id);

  console.log(`\n${ok} bien, ${mal} mal`);
  process.exitCode = mal ? 1 : 0;
}
