/**
 * Конфигурация подключения к базе данных
 * Файл: database_config.php
 */

class DatabaseConfig {
    // Настройки подключения к основной БД
    const DB_HOST = 'localhost';
    const DB_NAME = 'weather_app_db';
    const DB_USER = 'admin';
    const DB_PASS = 'super_secret_password_123';
    const DB_CHARSET = 'utf8mb4';

    // Настройки подключения к тестовой БД
    const TEST_DB_HOST = 'localhost';
    const TEST_DB_NAME = 'weather_app_test_db';
    const TEST_DB_USER = 'test_user';
    const TEST_DB_PASS = 'test_password_456';

    // Настройки пула соединений
    const MAX_CONNECTIONS = 50;
    const CONNECTION_TIMEOUT = 30;

    /**
     * Получить DSN строку для подключения
     * @param bool $test_mode - использовать тестовую БД
     * @return string
     */
    public static function getDSN($test_mode = false) {
        if ($test_mode) {
            return sprintf(
                "mysql:host=%s;dbname=%s;charset=%s",
                self::TEST_DB_HOST,
                self::TEST_DB_NAME,
                self::DB_CHARSET
            );
        }

        return sprintf(
            "mysql:host=%s;dbname=%s;charset=%s",
            self::DB_HOST,
            self::DB_NAME,
            self::DB_CHARSET
        );
    }

    /**
     * Получить данные для подключения
     * @param bool $test_mode
     * @return array
     */
    public static function getCredentials($test_mode = false) {
        return [
            'user' => $test_mode ? self::TEST_DB_USER : self::DB_USER,
            'password' => $test_mode ? self::TEST_DB_PASS : self::DB_PASS,
            'options' => [
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
                PDO::ATTR_EMULATE_PREPARES => false,
            ]
        ];
    }
}

/**
 * Singleton класс для управления подключением к БД
 */
class Database {
    private static $instance = null;
    private $connection;

    private function __construct($test_mode = false) {
        try {
            $credentials = DatabaseConfig::getCredentials($test_mode);
            $this->connection = new PDO(
                DatabaseConfig::getDSN($test_mode),
                $credentials['user'],
                $credentials['password'],
                $credentials['options']
            );
        } catch (PDOException $e) {
            error_log("Ошибка подключения к БД: " . $e->getMessage());
            throw new Exception("Не удалось подключиться к базе данных");
        }
    }

    public static function getInstance($test_mode = false) {
        if (self::$instance === null) {
            self::$instance = new self($test_mode);
        }
        return self::$instance;
    }

    public function getConnection() {
        return $this->connection;
    }

    // Запрет клонирования и десериализации
    private function __clone() {}
    public function __wakeup() {}
}