<?php
namespace Gestoreasy\Core\Tenant;

use PDO;
use Gestoreasy\Core\Config\Config;

class ConnectionManager {
    private static array $pool = [];

    public static function forTenant(?string $tenantId = null): PDO {
        $tenantId = $tenantId ?? TenantContext::getTenantId();
        if (!isset(self::$pool[$tenantId])) {
            $dbHost = Config::get('DB_HOST', '127.0.0.1');
            $dbUser = Config::get('DB_USERNAME', 'root');
            $dbPass = Config::get('DB_PASSWORD', '');
            $dbBase = Config::get('DB_BASE_PREFIX', 'gestoreasy_tenant_');
            $dbName = $dbBase . $tenantId;
            $dsn = "mysql:host=$dbHost;dbname=$dbName;charset=utf8mb4";
            $pdo = new PDO($dsn, $dbUser, $dbPass, [
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
                PDO::ATTR_EMULATE_PREPARES => true,
                // Evitar erro de queries não-bufferizadas ativas ao executar múltiplos SELECTs em sequência
                PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
            ]);
            self::$pool[$tenantId] = $pdo;
        }
        // Garantir atributo de queries bufferizadas mesmo em conexões já existentes no pool
        try { self::$pool[$tenantId]->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true); } catch (\Throwable $e) {}
        return self::$pool[$tenantId];
    }

    public static function refreshTenantConnection(?string $tenantId = null): PDO {
        $tenantId = $tenantId ?? TenantContext::getTenantId();
        $dbHost = Config::get('DB_HOST', '127.0.0.1');
        $dbUser = Config::get('DB_USERNAME', 'root');
        $dbPass = Config::get('DB_PASSWORD', '');
        $dbBase = Config::get('DB_BASE_PREFIX', 'gestoreasy_tenant_');
        $dbName = $dbBase . $tenantId;
        $dsn = "mysql:host=$dbHost;dbname=$dbName;charset=utf8mb4";
        $pdo = new PDO($dsn, $dbUser, $dbPass, [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
            PDO::ATTR_EMULATE_PREPARES => true,
            PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
        ]);
        self::$pool[$tenantId] = $pdo;
        return $pdo;
    }
}