-- ============================================================================
-- RAPPORT — RPC-Funktionen für Sign-Up / Studio-Anlage
-- ============================================================================
-- Zwei SECURITY-DEFINER-Funktionen, die der signUp-Flow im Frontend braucht:
--
-- 1. `ensure_profile(username, display_name)` — legt für den eingeloggten User
--    eine profiles-Zeile an (oder aktualisiert sie). Würde sonst an fehlender
--    INSERT-Policy scheitern.
--
-- 2. `create_studio_with_admin(name, slug)` — legt atomar Studio + Membership
--    als Admin für den eingeloggten User an. Seed-Trigger füllt die Defaults.
--    Liefert die studio_id zurück.
--
-- Beide laufen mit Postgres-Owner-Rechten und sind explizit von einem
-- authentifizierten User aufrufbar (Check via auth.uid()).
-- ============================================================================

create or replace function ensure_profile(p_username text, p_display_name text)
  returns uuid
  language plpgsql
  security definer
as $$
declare
  v_user_id uuid := auth.uid();
begin
  if v_user_id is null then
    raise exception 'Authentication required';
  end if;

  insert into profiles (id, username, display_name)
  values (v_user_id, p_username, p_display_name)
  on conflict (id) do update set
    username = excluded.username,
    display_name = excluded.display_name;

  return v_user_id;
end;
$$;

create or replace function create_studio_with_admin(p_name text, p_slug text)
  returns uuid
  language plpgsql
  security definer
as $$
declare
  v_studio_id uuid;
  v_user_id uuid := auth.uid();
begin
  if v_user_id is null then
    raise exception 'Authentication required';
  end if;

  insert into studios (name, slug) values (p_name, p_slug) returning id into v_studio_id;
  -- seed_studio_defaults-Trigger läuft hier automatisch und füllt Stammdaten
  insert into studio_members (studio_id, user_id, app_role_id)
    values (v_studio_id, v_user_id, 'r-admin');

  return v_studio_id;
end;
$$;

-- Sichtbarkeit: authentifizierte User dürfen diese Funktionen aufrufen.
-- (`security definer` reicht — der Owner ist `postgres`, der hat überall Rechte.)
grant execute on function ensure_profile(text, text) to authenticated;
grant execute on function create_studio_with_admin(text, text) to authenticated;
