<?php
/**
 * SAMPLE - Ne contient aucun secret.
 * Copie en config/database.php (ignoré par git) OU utilise des variables d'environnement.
 */
return [
    'host'    => getenv('DB_HOST') ?: 'localhost',
    'port'    => (int)(getenv('DB_PORT') ?: 3306),
    'dbname'  => getenv('DB_NAME') ?: 'mathematiques_db',

    // volontairement non renseignés dans le sample
    'user'    => getenv('DB_USER') ?: '',
    'pass'    => getenv('DB_PASS') ?: '',

    'charset' => 'utf8mb4',
];

/**
 * Classe Database - Gestion de la connexion PDO
 */
class Database {
    private static $instance = null;
    private $connection;
    
    private function __construct() {
        try {
            $dsn = "mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=" . DB_CHARSET;
            $options = [
                PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
                PDO::ATTR_EMULATE_PREPARES   => false,
                PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES " . DB_CHARSET
            ];
            
            $this->connection = new PDO($dsn, DB_USER, DB_PASS, $options);
            
        } catch (PDOException $e) {
            error_log("Erreur de connexion à la base de données : " . $e->getMessage());
            die("Erreur de connexion à la base de données. Veuillez contacter l'administrateur.");
        }
    }
    
    /**
     * Obtenir l'instance unique (Singleton)
     */
    public static function getInstance() {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }
    
    /**
     * Obtenir la connexion PDO
     */
    public function getConnection() {
        return $this->connection;
    }
   /**
     * Exécuter une requête et récupérer UNE ligne
     */
    public function fetchOne($query, $params = []) {
        $stmt = $this->connection->prepare($query);
        $stmt->execute($params);
        return $stmt->fetch(PDO::FETCH_ASSOC);
    }
    
    /**
     * Exécuter une requête et récupérer TOUTES les lignes
     */
    public function fetchAll($query, $params = []) {
        $stmt = $this->connection->prepare($query);
        $stmt->execute($params);
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
    
    /**
     * Exécuter une requête (INSERT, UPDATE, DELETE)
     */
    public function query($query, $params = []) {
        $stmt = $this->connection->prepare($query);
        return $stmt->execute($params);
    }
    
    /**
     * Insérer et retourner l'ID
     */
    public function insert($query, $params = []) {
        $this->query($query, $params);
        return $this->connection->lastInsertId();
    }    
    /**
     * Empêcher le clonage de l'instance
     */
    private function __clone() {}
    
    /**
     * Empêcher la désérialisation de l'instance
     */
    public function __wakeup() {
        throw new Exception("Cannot unserialize singleton");
    }
}
