<?php

declare(strict_types=1);

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Symfony\Component\HttpFoundation\Response;

/**
 * Переключает активное подключение к БД на pgsql_admin (роль crm_admin_user)
 * на время обработки SaaS-admin запроса и восстанавливает прежнее в finally.
 *
 * Зачем: после переезда на Managed PG (Путь А) AdminTenantsController и
 * AdminBillingController ходят под default-ролью crm_app_user, у которой нет
 * cross-tenant доступа (RLS tenants_self_isolation) → пустые «Тенанты»/«Биллинг».
 * crm_admin_user имеет политику srv_bypass + GRANT на админ-таблицы.
 *
 * Ставится ПОСЛЕ saas-admin (EnsureSaasAdmin), чтобы гейт и проверка
 * impersonation прошли под исходным подключением. Контроллеры, явно прибитые к
 * pgsql_supplier, не затрагиваются — меняется только default.
 *
 * См. docs/superpowers/specs/2026-06-27-admin-db-connection-path-a-design.md
 */
class UseAdminConnection
{
    public function handle(Request $request, Closure $next): Response
    {
        $previous = DB::getDefaultConnection();
        DB::setDefaultConnection('pgsql_admin');

        try {
            return $next($request);
        } finally {
            DB::setDefaultConnection($previous);
        }
    }
}
