create table if not exists public.application_admins (
  id uuid primary key default gen_random_uuid(),
  email text not null,
  email_normalized text not null,
  status text not null default 'active' check (status in ('active', 'disabled')),
  permissions_json jsonb not null default '[]'::jsonb,
  created_by_user_id uuid references public.users (id) on delete set null,
  created_at timestamptz not null default now(),
  updated_at timestamptz not null default now()
);

create unique index if not exists application_admins_email_normalized_idx on public.application_admins (email_normalized);

drop trigger if exists set_application_admins_updated_at on public.application_admins;
create trigger set_application_admins_updated_at
before update on public.application_admins
for each row
execute function public.set_updated_at();

create table if not exists public.admin_access_audit (
  id uuid primary key default gen_random_uuid(),
  actor_user_id uuid references public.users (id) on delete set null,
  actor_email text,
  route text not null,
  action text not null,
  target_workspace_id uuid references public.workspaces (id) on delete set null,
  metadata_json jsonb not null default '{}'::jsonb,
  occurred_at timestamptz not null default now()
);

create index if not exists admin_access_audit_occurred_at_idx on public.admin_access_audit (occurred_at desc);
create index if not exists admin_access_audit_actor_user_id_idx on public.admin_access_audit (actor_user_id);
create index if not exists admin_access_audit_target_workspace_id_idx on public.admin_access_audit (target_workspace_id);
