-- HU-ROOMS: Admin RLS — reconocer admin por email del JWT si public.users.id ≠ auth.uid()
--
-- Contexto: users_select_self_or_admin usa public.is_admin_user(). La versión anterior solo
-- miraba role en la fila WHERE id = auth.uid(). Si el perfil admin existe con otro id pero el
-- mismo email en el JWT (cuentas duplicadas / migraciones), el admin veía solo su fila en
-- joins (ej. métricas "Todas las reservas" con guión en usuario).
--
-- Esta función mantiene el chequeo por id y agrega: email del JWT (lower) = email de una fila
-- con role = 'admin'. Idempotente (solo reemplaza la función).

BEGIN;

CREATE OR REPLACE FUNCTION public.is_admin_user()
RETURNS BOOLEAN
LANGUAGE plpgsql
SECURITY DEFINER
SET search_path = public
AS $$
DECLARE
  current_role TEXT;
  jwt_email TEXT;
BEGIN
  IF auth.uid() IS NULL THEN
    RETURN false;
  END IF;

  SELECT u.role
  INTO current_role
  FROM public.users u
  WHERE u.id = auth.uid()
  LIMIT 1;

  IF current_role = 'admin' THEN
    RETURN true;
  END IF;

  jwt_email := nullif(trim(lower((auth.jwt() ->> 'email'))), '');

  IF jwt_email IS NULL THEN
    RETURN false;
  END IF;

  RETURN EXISTS (
    SELECT 1
    FROM public.users u
    WHERE lower(trim(u.email)) = jwt_email
      AND u.role = 'admin'
  );
END;
$$;

REVOKE ALL ON FUNCTION public.is_admin_user() FROM PUBLIC;
GRANT EXECUTE ON FUNCTION public.is_admin_user() TO authenticated;
GRANT EXECUTE ON FUNCTION public.is_admin_user() TO service_role;

COMMIT;
