-- ============================================================
-- Gustito Xpress — el cliente ve QUIEN lo va a atender.
--
-- Cuando el cliente llama al mesero y uno confirma "Voy" (atender_llamada,
-- guarda atendida_por), el cliente debe ver "Ya viene <nombre> a tu mesa".
-- cuenta_mesa gana viene_mesero: el nombre del mesero que atendio la ultima
-- llamada de tipo 'mesero' en los ultimos 5 minutos.
-- ============================================================
drop function if exists public.cuenta_mesa(uuid);
create function public.cuenta_mesa(p_cuenta_id uuid)
returns table(
  id uuid, mesa text, estado text, restaurante_nombre text, restaurante_slug text,
  restaurante_color text, restaurante_telefono text, tasa_bs numeric, total_usd numeric,
  metodo_pago text, metodos_pago jsonb, promedio_min integer, pedidos jsonb, mesero_nombre text,
  modo_cuenta text, comensales jsonb, llamadas jsonb, tiempo_estimado_min integer, viene_mesero text
)
language sql stable security definer set search_path to 'public'
as $function$
  select c.id, c.mesa, c.estado,
         r.nombre, r.slug, r.color_primario, r.telefono,
         r.tasa_bs,
         coalesce((select sum(p.total_usd) from public.pedidos p where p.cuenta_id = c.id and p.estado <> 'cancelado'), 0),
         c.metodo_pago, r.metodos_pago,
         coalesce(r.sala_promedio_min, 10),
         coalesce((
           select jsonb_agg(jsonb_build_object(
             'id', p.id, 'codigo', p.codigo, 'estado', p.estado, 'total_usd', p.total_usd,
             'cliente', p.cliente_nombre,
             'pagado', (p.pago_mesa_id is not null and coalesce((select pm.verificado from public.pagos_mesa pm where pm.id = p.pago_mesa_id), false)),
             'pago_estado', (case when p.pago_mesa_id is null then null
                                  when coalesce((select pm.verificado from public.pagos_mesa pm where pm.id = p.pago_mesa_id), false) then 'pagado'
                                  else 'por_revisar' end),
             'comensal_id', p.comensal_id,
             'comensal', (select cm.nombre from public.comensales_mesa cm where cm.id = p.comensal_id),
             'items', coalesce((select jsonb_agg(jsonb_build_object(
                         'nombre', it.nombre, 'cantidad', it.cantidad, 'precio_usd', it.precio_usd, 'nota', it.nota))
                       from public.pedido_items it where it.pedido_id = p.id), '[]'::jsonb)
           ) order by p.recibido_en)
           from public.pedidos p where p.cuenta_id = c.id
         ), '[]'::jsonb),
         c.mesero_nombre,
         c.modo_cuenta,
         coalesce((
           select jsonb_agg(jsonb_build_object(
             'id', cm.id, 'nombre', cm.nombre, 'orden', cm.orden,
             'total_usd', coalesce((select sum(p.total_usd) from public.pedidos p where p.comensal_id = cm.id and p.estado <> 'cancelado'), 0),
             'pagado_usd', coalesce((select sum(p.total_usd) from public.pedidos p join public.pagos_mesa pm on pm.id = p.pago_mesa_id where p.comensal_id = cm.id and p.estado <> 'cancelado' and pm.verificado), 0),
             'por_revisar_usd', coalesce((select sum(p.total_usd) from public.pedidos p join public.pagos_mesa pm on pm.id = p.pago_mesa_id where p.comensal_id = cm.id and p.estado <> 'cancelado' and not pm.verificado), 0)
           ) order by cm.orden)
           from public.comensales_mesa cm where cm.cuenta_id = c.id
         ), '[]'::jsonb),
         coalesce((select jsonb_agg(l.tipo) from public.llamadas_mesa l where l.cuenta_id = c.id and l.atendida_en is null), '[]'::jsonb),
         (select max(p.tiempo_estimado_min) from public.pedidos p
           where p.cuenta_id = c.id and p.estado in ('recibido','confirmado','preparando')),
         (select pf.nombre from public.llamadas_mesa l
           join public.perfiles pf on pf.id = l.atendida_por
          where l.cuenta_id = c.id and l.tipo = 'mesero' and l.atendida_en is not null
            and l.atendida_en > now() - interval '5 minutes'
          order by l.atendida_en desc limit 1)
  from public.cuentas_mesa c
  join public.restaurantes r on r.id = c.restaurante_id
  where c.id = p_cuenta_id;
$function$;
grant execute on function public.cuenta_mesa(uuid) to anon, authenticated;
