-- Allow privileged backend contexts (service role / no JWT, e.g. the Buildium import) to update
-- finalized ARC applications, alongside admins. Client writes by non-admins remain blocked by RLS,
-- so this does not weaken the user-facing lock.
CREATE OR REPLACE FUNCTION public.prevent_updates_on_finalized_arc()
RETURNS trigger
LANGUAGE plpgsql
SECURITY DEFINER
SET search_path TO 'public'
AS $function$
BEGIN
  IF lower(COALESCE(OLD.status,'')) IN ('approved','denied') THEN
    -- auth.uid() IS NULL => no end-user JWT (service role / backend job); admins also exempt.
    IF auth.uid() IS NULL OR public.has_role(auth.uid(), 'admin'::public.app_role) THEN
      RETURN NEW;
    END IF;

    RAISE EXCEPTION 'This ARC application has been finalized (approved or denied) and is locked from further changes.'
      USING ERRCODE = 'check_violation';
  END IF;

  RETURN NEW;
END;
$function$;
