-- Agrupa la cola de la sala de espera por mesa, no por pedido.
-- Antes: una mesa con 2 pedidos activos (ej. arepas + despues un refresco
-- extra) aparecia como 2 tarjetas separadas, cada una contando como un
-- puesto entero de cola para el calculo de tiempo estimado del frontend.
-- Ahora: se agrupan los pedidos activos de la MISMA mesa en una sola fila,
-- con todos los items a_cocina juntos, el codigo del pedido mas viejo como
-- referencia, y "preparando" si CUALQUIERA de sus pedidos ya esta en cocina.
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', t.mesa,
                 'codigo', t.codigo,
                 'estado', t.estado,
                 'items', t.items
               ) order by t.recibido_en
             )
      from (
        select
          p.mesa,
          min(p.recibido_en) as recibido_en,
          (array_agg(p.codigo order by p.recibido_en))[1] as codigo,
          case when bool_or(p.estado = 'preparando') then 'preparando' else 'confirmado' end as estado,
          jsonb_agg(jsonb_build_object('cantidad', it.cantidad, 'nombre', it.nombre) order by it.id) as items
        from public.pedidos p
        join public.restaurantes r on r.id = p.restaurante_id
        join public.pedido_items it on it.pedido_id = p.id and it.a_cocina
        where r.slug = p_slug
          and p.tipo_entrega = 'mesa'
          and p.estado in ('confirmado', 'preparando')
        group by p.mesa
      ) t
    ), '[]'::jsonb)
  );
$function$;
