-- =============================================================================
-- abrir_mesa: permite guardar un nombre de referencia tambien en modo 'unica'
-- ("Todos juntos"). Antes el bloque que registra comensales_mesa exigia
-- p_modo = 'separada'; en 'unica' no habia forma de dejar ni un nombre, y
-- Gilberto lo detecto probando en caliente: la mesa quedaba sin ninguna
-- referencia de a nombre de quien esta.
--
-- El insert es EL MISMO para los dos modos (un solo comensal en unica, N en
-- separada via unnest with ordinality): basta con quitar el filtro de modo.
-- =============================================================================

CREATE OR REPLACE FUNCTION public.abrir_mesa(p_mesa text, p_comensales integer DEFAULT 1, p_modo text DEFAULT 'unica'::text, p_nombres text[] DEFAULT NULL::text[])
 RETURNS uuid
 LANGUAGE plpgsql
 SECURITY DEFINER
 SET search_path TO 'public'
AS $function$
declare
  v_rest      uuid := fn_mi_restaurante();
  v_cuenta_id uuid;
  v_mesero_id uuid;
  v_mesero_nombre text;
begin
  if v_rest is null or not (fn_es_staff_de(v_rest) or fn_es_admin()) then
    raise exception 'Sin permiso';
  end if;
  if coalesce(nullif(trim(p_mesa), ''), '') = '' then
    raise exception 'Falta el numero de mesa';
  end if;
  if p_modo not in ('unica','separada') then
    raise exception 'Modo de cuenta invalido';
  end if;

  select pf.id, coalesce(nullif(trim(pf.nombre), ''), 'Mesero')
    into v_mesero_id, v_mesero_nombre
    from public.perfiles pf where pf.id = auth.uid();

  -- Respeta el anti-cruce: una sola cuenta activa por mesa.
  insert into public.cuentas_mesa (restaurante_id, mesa, comensales, modo_cuenta, mesero_id, mesero_nombre)
    values (v_rest, trim(p_mesa), greatest(1, coalesce(p_comensales, 1)), p_modo, v_mesero_id, v_mesero_nombre)
    on conflict (restaurante_id, mesa) where (estado <> 'cerrada') do nothing;

  select id into v_cuenta_id from public.cuentas_mesa
   where restaurante_id = v_rest and mesa = trim(p_mesa) and estado <> 'cerrada' limit 1;

  -- Si la mesa ya estaba abierta (por QR o por otro toque): configura personas
  -- y modo, y toma la mesa si estaba sin mesero (no le pisa el dueño a otro).
  update public.cuentas_mesa
     set comensales  = greatest(1, coalesce(p_comensales, comensales)),
         modo_cuenta  = p_modo,
         mesero_id    = coalesce(mesero_id, v_mesero_id),
         mesero_nombre = coalesce(mesero_nombre, v_mesero_nombre)
   where id = v_cuenta_id;

  -- Registra las personas (solo si no hay ninguna aun, para no duplicar). Antes
  -- exigia p_modo='separada'; ahora aplica igual en 'unica' (1 nombre de
  -- referencia) que en 'separada' (N nombres, uno por comensal).
  if p_nombres is not null
     and not exists (select 1 from public.comensales_mesa where cuenta_id = v_cuenta_id) then
    insert into public.comensales_mesa (cuenta_id, restaurante_id, nombre, orden)
    select v_cuenta_id, v_rest, nullif(trim(n.nombre), ''), n.ord::int
      from unnest(p_nombres) with ordinality as n(nombre, ord)
     where nullif(trim(n.nombre), '') is not null;
  end if;

  return v_cuenta_id;
end;
$function$;
