-- ============================================================
-- Gustito Xpress — corregir un pedido: quitar un renglon suelto.
--
-- Para meseros y panel (delivery, mesa, pickup). Quita un item de un pedido
-- ACTIVO y no cobrado, recalcula el total. Si queda sin items, cancela el
-- pedido. (Cancelar el pedido completo usa cambiar_estado_pedido -> cancelado.)
-- ============================================================
create or replace function public.quitar_item_pedido(p_item_id uuid)
returns void
language plpgsql security definer set search_path to 'public'
as $function$
declare
  v_pedido uuid;
  v_rest   uuid;
  v_estado text;
  v_deliv  numeric(10,2);
  v_pago   uuid;
  v_n      int;
  v_sub    numeric(10,2);
begin
  select pi.pedido_id, p.restaurante_id, p.estado, p.costo_delivery_usd, p.pago_mesa_id
    into v_pedido, v_rest, v_estado, v_deliv, v_pago
    from public.pedido_items pi
    join public.pedidos p on p.id = pi.pedido_id
   where pi.id = p_item_id;
  if v_pedido is null then raise exception 'El renglon no existe'; end if;
  if not (fn_es_staff_de(v_rest) or fn_es_admin()) then raise exception 'Sin permiso'; end if;
  if v_estado in ('entregado','cancelado') then raise exception 'El pedido ya esta cerrado'; end if;
  if v_pago is not null then raise exception 'Ese pedido ya fue cobrado, no se puede corregir'; end if;

  delete from public.pedido_items where id = p_item_id;

  select count(*), coalesce(sum(precio_usd * cantidad), 0)
    into v_n, v_sub from public.pedido_items where pedido_id = v_pedido;

  if v_n = 0 then
    -- Sin renglones: el pedido se cancela (queda fuera de los totales).
    update public.pedidos set estado = 'cancelado', cancelado_en = now(), subtotal_usd = 0, total_usd = 0
     where id = v_pedido;
  else
    update public.pedidos set subtotal_usd = v_sub, total_usd = v_sub + coalesce(v_deliv, 0)
     where id = v_pedido;
  end if;
end;
$function$;
grant execute on function public.quitar_item_pedido(uuid) to authenticated;
