-- =============================================================================
-- F5 (parte supabase_admin) — refresh dinâmico dos schemas expostos no PostgREST
--
-- ⚠️ APLICAR COMO supabase_admin (postgres NÃO é superuser neste stack e não
--    consegue ALTER ROLE authenticator). Mesmo padrão do gotcha de `documents`.
--
--    docker exec -e PGPASSWORD=postgres supabase_db_agenciapsi-primesakai \
--      psql -U supabase_admin -h 127.0.0.1 -d postgres \
--      -f /dev/stdin < database-novo/manual/f5_pgrst_refresh_schemas.supabase_admin.sql
--
-- A config in-database do PostgREST (db-config, ligada por padrão) lê
-- pgrst.db_schemas da role `authenticator`. Setar essa GUC + NOTIFY reload
-- expõe/retira schemas tenant SEM restart do container. A GUC persiste em
-- pg_db_role_setting (sobrevive a supabase stop/start).
--
-- A lista é derivada SEMPRE de public.tenant_schemas (fonte da verdade dos
-- schemas provisionados). Disparada pelo trigger em tenant_schemas (migration
-- 20260613000002) a cada clone/drop de tenant.
-- =============================================================================

CREATE OR REPLACE FUNCTION public.refresh_pgrst_schemas()
RETURNS text
LANGUAGE plpgsql
SECURITY DEFINER            -- roda como o OWNER (supabase_admin/superuser)
SET search_path TO 'public', 'pg_temp'
AS $$
DECLARE
    v_list text;
BEGIN
    SELECT string_agg(s, ', ' ORDER BY ord, s)
      INTO v_list
      FROM (
          SELECT 'public'::text AS s, 0 AS ord
          UNION ALL SELECT 'graphql_public', 1
          UNION ALL SELECT schema_name, 2 FROM public.tenant_schemas
      ) x;

    -- baseline defensivo se a tabela ainda não existir / vazia
    IF v_list IS NULL OR v_list = '' THEN
        v_list := 'public, graphql_public';
    END IF;

    EXECUTE format('ALTER ROLE authenticator SET pgrst.db_schemas = %L', v_list);
    NOTIFY pgrst, 'reload config';   -- re-lê db_schemas
    NOTIFY pgrst, 'reload schema';   -- reconstrói o cache de schema
    RETURN v_list;
END;
$$;

-- Garante owner superuser (caso a função já existisse owned por postgres)
ALTER FUNCTION public.refresh_pgrst_schemas() OWNER TO supabase_admin;

REVOKE ALL ON FUNCTION public.refresh_pgrst_schemas() FROM PUBLIC;
GRANT EXECUTE ON FUNCTION public.refresh_pgrst_schemas() TO postgres, service_role;

-- Seta o baseline imediatamente
SELECT public.refresh_pgrst_schemas();
