-- =============================================================================
-- P2: impedir publicar un producto vendible en $0 SIN opciones (se pediria gratis).
-- Un producto en $0 es valido SOLO si su precio sale de una opcion (modelo
-- "cantidad"/tamano: base 0 + opcion obligatoria con precio). Si esta disponible,
-- en $0 y sin ninguna opcion, es un error de config (cliente lo pide gratis).
-- Guard BEFORE INSERT/UPDATE: bloquea guardar ese estado. Las filas viejas malas
-- (ej. "Cerdo al barril" de Arepa Power) quedan hasta que se editen, y ahi obliga
-- a ponerle precio. No afecta a los productos "cantidad" (tienen opciones).
-- =============================================================================

create or replace function public.fn_guard_producto_cero() returns trigger
language plpgsql
set search_path to 'public'
as $$
begin
  if new.disponible
     and coalesce(new.precio_usd, 0) = 0
     and jsonb_array_length(coalesce(new.opciones, '[]'::jsonb)) = 0
  then
    raise exception 'Un producto disponible no puede estar en $0 sin opciones. Ponle precio o agregale opciones (o marcalo como no disponible).';
  end if;
  return new;
end $$;

drop trigger if exists trg_guard_producto_cero on public.productos;
create trigger trg_guard_producto_cero
  before insert or update on public.productos
  for each row execute function public.fn_guard_producto_cero();
