-- ============================================================
-- Gustito Xpress — las BEBIDAS no van a la cocina ni a la sala de espera.
--
-- Solo lo que se COCINA aparece en la pantalla de cocina y en la sala de
-- espera. Las bebidas (y cualquier categoria que el dueño marque) no se
-- cocinan: el mesero las sirve, y no tienen sentido en la cola de la cocina.
--
--   * categorias.a_cocina  : el dueño marca si la categoria va a cocina (def true).
--   * pedido_items.a_cocina : se estampa al crear el item, segun su categoria
--     (trigger, no toca crear_pedido). Denormalizado = robusto ante cambios.
--   * sala_espera            : excluye items que no van a cocina y pedidos que
--     serian solo bebidas.
-- ============================================================

alter table public.categorias add column if not exists a_cocina boolean not null default true;
alter table public.pedido_items add column if not exists a_cocina boolean not null default true;

-- ---- trigger: estampa a_cocina en el item segun su categoria ----
create or replace function public.tg_pedido_item_a_cocina()
returns trigger language plpgsql security definer set search_path to 'public' as $$
begin
  new.a_cocina := coalesce(
    (select cat.a_cocina
       from public.productos pr
       left join public.categorias cat on cat.id = pr.categoria_id
      where pr.id = new.producto_id),
    true);
  return new;
end $$;
drop trigger if exists trg_pedido_item_a_cocina on public.pedido_items;
create trigger trg_pedido_item_a_cocina before insert on public.pedido_items
  for each row execute function public.tg_pedido_item_a_cocina();

-- ---- backfill de lo existente (hoy todo queda en true; cambia al marcar) ----
update public.pedido_items pi set a_cocina = coalesce(
  (select cat.a_cocina from public.productos pr
     left join public.categorias cat on cat.id = pr.categoria_id
    where pr.id = pi.producto_id), true)
where true;

-- ---- sala_espera: solo lo que se cocina; sin pedidos de solo bebidas ----
create or replace function public.sala_espera(p_slug text)
returns jsonb
language sql stable security definer set search_path to 'public'
as $function$
  select jsonb_build_object(
    'restaurante', (
      select jsonb_build_object(
        'nombre', r.nombre, 'logo_url', r.logo_url, 'portada_url', r.portada_url,
        'color', r.color_primario, 'promedio_min', r.sala_promedio_min, 'abierto', r.abierto
      )
      from public.restaurantes r
      where r.slug = p_slug and r.activo and r.publicado
    ),
    'cola', coalesce((
      select jsonb_agg(
               jsonb_build_object(
                 'mesa', p.mesa,
                 'codigo', p.codigo,
                 'estado', p.estado,
                 'items', coalesce((
                   select jsonb_agg(jsonb_build_object('cantidad', it.cantidad, 'nombre', it.nombre) order by it.id)
                   from public.pedido_items it where it.pedido_id = p.id and it.a_cocina
                 ), '[]'::jsonb)
               ) order by p.recibido_en
             )
      from public.pedidos p
      join public.restaurantes r on r.id = p.restaurante_id
      where r.slug = p_slug
        and p.tipo_entrega = 'mesa'
        and p.estado in ('confirmado', 'preparando')
        and exists (select 1 from public.pedido_items it where it.pedido_id = p.id and it.a_cocina)
    ), '[]'::jsonb)
  );
$function$;
