<?php
// app/config/db_integracoes.php

class IntegracaoERPConnections {
  private static $connections = []; // Pool
  private static $configCache = [];
  
  /**
   * Carrega config de uma integração
   */
  public static function getConfig($cdintegracao, $pdo_principal) {
    if (isset(self::$configCache[$cdintegracao])) {
      return self::$configCache[$cdintegracao];
    }
    
    $stmt = $pdo_principal->prepare("
      SELECT * FROM back.integracao_erp WHERE cdintegracao = :id AND flativo = true
    ");
    $stmt->execute([':id' => $cdintegracao]);
    $config = $stmt->fetch(PDO::FETCH_ASSOC);
    
    if (!$config) {
      throw new Exception("Integração ERP não encontrada ou inativa: $cdintegracao");
    }
    
    self::$configCache[$cdintegracao] = $config;
    return $config;
  }
  
  /**
   * Conecta a um banco ERP
   */
  public static function connect($cdintegracao, $pdo_principal) {
    if (isset(self::$connections[$cdintegracao])) {
      return self::$connections[$cdintegracao];
    }
    
    $config = self::getConfig($cdintegracao, $pdo_principal);
    
    // Montar DSN
    $dsn = sprintf(
      "%s:host=%s;port=%d;dbname=%s",
      $config['tipo_banco'],
      $config['host'],
      $config['porta'],
      $config['dbname']
    );
    
    try {
      $pdo = new PDO($dsn, $config['usuario'], $config['senha_encrypted']);
      $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
      
      // Configurar encoding UTF-8
      if ($config['tipo_banco'] === 'pgsql') {
        $pdo->exec("SET NAMES 'UTF8'");
        $pdo->exec("SET client_encoding = 'UTF8'");
        $pdo->exec("SET TIMEZONE = 'America/Sao_Paulo'");
      }
      
      // Configurar timezone para Brasil na sessão do ERP também
      try {
        if ($config['tipo_banco'] === 'pgsql') {
          // Timezone já configurado acima
        }
      } catch (Exception $e) {
        // Se não conseguir configurar timezone, continua normalmente
        // (pode ser que o banco de origem não suporte)
      }
      
      self::$connections[$cdintegracao] = $pdo;
      return $pdo;
    } catch (PDOException $e) {
      throw new Exception("Erro ao conectar ao ERP: " . $e->getMessage());
    }
  }
  
  /**
   * Fecha uma conexão
   */
  public static function disconnect($cdintegracao) {
    unset(self::$connections[$cdintegracao]);
  }
  
  /**
   * Fecha todas as conexões
   */
  public static function disconnectAll() {
    self::$connections = [];
  }
}
?>