<?php

/**
 * Configuration des environnements de migration
 *
 * Utilise AppConfig pour récupérer la configuration DB
 * Source: geosector (synchronisée par PM7)
 * Cibles: dva_geo (IN3/maria3), rca_geo (IN3/maria3) ou pra_geo (IN4/maria4)
 */
class DatabaseConfig
{
    private const ENV_MAPPING = [
        'dva' => [
            'name' => 'DÉVELOPPEMENT',
            'hostname' => 'dapp.geosector.fr',
            'source_db' => 'geosector',
            'target_db' => 'dva_geo'
        ],
        'rca' => [
            'name' => 'RECETTE',
            'hostname' => 'rapp.geosector.fr',
            'source_db' => 'geosector',
            'target_db' => 'rca_geo'
        ],
        'pra' => [
            'name' => 'PRODUCTION',
            'hostname' => 'app3.geosector.fr',
            'source_db' => 'geosector',
            'target_db' => 'pra_geo'
        ]
    ];

    private $env;
    private $config;
    private $appConfig;

    /**
     * Constructeur
     *
     * @param string $env Environnement: 'dva', 'rca' ou 'pra'
     * @throws Exception Si l'environnement est invalide
     */
    public function __construct(string $env)
    {
        if (!isset(self::ENV_MAPPING[$env])) {
            throw new Exception("Invalid environment: $env. Use 'dva', 'rca' or 'pra'");
        }

        $this->env = $env;

        // Charger AppConfig (remonter de 4 niveaux: lib -> php -> migration2 -> scripts -> api)
        $appConfigPath = dirname(__DIR__, 4) . '/src/Config/AppConfig.php';
        if (!file_exists($appConfigPath)) {
            throw new Exception("AppConfig not found at: $appConfigPath");
        }
        require_once $appConfigPath;

        // Simuler le host pour AppConfig en CLI
        $hostname = self::ENV_MAPPING[$env]['hostname'];
        $_SERVER['SERVER_NAME'] = $hostname;
        $_SERVER['HTTP_HOST'] = $hostname;

        $this->appConfig = AppConfig::getInstance();

        // Récupérer la config DB depuis AppConfig
        $dbConfig = $this->appConfig->getDatabaseConfig();

        if (!$dbConfig || !isset($dbConfig['host'])) {
            throw new Exception("Database configuration not found for hostname: $hostname");
        }

        // Construire la config pour la migration
        $this->config = [
            'name' => self::ENV_MAPPING[$env]['name'],
            'host' => $dbConfig['host'],
            'port' => $dbConfig['port'] ?? 3306,
            'user' => $dbConfig['username'],
            'pass' => $dbConfig['password'],
            'source_db' => self::ENV_MAPPING[$env]['source_db'],
            'target_db' => self::ENV_MAPPING[$env]['target_db']
        ];
    }

    /**
     * Retourne l'environnement actuel
     */
    public function getEnv(): string
    {
        return $this->env;
    }

    /**
     * Retourne le nom complet de l'environnement
     */
    public function getEnvName(): string
    {
        return $this->config['name'];
    }

    /**
     * Retourne l'hôte de la base de données
     */
    public function getHost(): string
    {
        return $this->config['host'];
    }

    /**
     * Retourne le port de la base de données
     */
    public function getPort(): int
    {
        return $this->config['port'];
    }

    /**
     * Retourne l'utilisateur de la base de données
     */
    public function getUser(): string
    {
        return $this->config['user'];
    }

    /**
     * Retourne le mot de passe de la base de données
     */
    public function getPassword(): string
    {
        return $this->config['pass'];
    }

    /**
     * Retourne le nom de la base source
     */
    public function getSourceDb(): string
    {
        return $this->config['source_db'];
    }

    /**
     * Retourne le nom de la base cible
     */
    public function getTargetDb(): string
    {
        return $this->config['target_db'];
    }

    /**
     * Retourne toute la configuration
     */
    public function getConfig(): array
    {
        return $this->config;
    }

    /**
     * Détecte automatiquement l'environnement depuis le hostname
     *
     * @return string 'dva', 'rca' ou 'pra' (défaut: 'dva')
     */
    public static function autoDetect(): string
    {
        $hostname = gethostname();

        switch ($hostname) {
            case 'dva-geo':
                return 'dva';
            case 'rca-geo':
                return 'rca';
            case 'pra-geo':
                return 'pra';
            default:
                return 'dva'; // Défaut
        }
    }

    /**
     * Vérifie si un environnement existe
     */
    public static function exists(string $env): bool
    {
        return isset(self::ENV_MAPPING[$env]);
    }

    /**
     * Retourne la liste des environnements disponibles
     */
    public static function getAvailableEnvironments(): array
    {
        return array_keys(self::ENV_MAPPING);
    }
}
