<?php
declare(strict_types=1);

$host = "127.0.0.1";
$dbName = "u414285242_test";
$username = "root";
$password = "";
$charset = "utf8mb4";

$dsn = "mysql:host={$host};dbname={$dbName};charset={$charset}";

try {
    $pdo = new PDO($dsn, $username, $password, [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    ]);
} catch (PDOException $e) {
    exit("Erreur de connexion a la base de donnees : " . $e->getMessage());
}

/**
 * Migration defensive pour eviter les erreurs de clic sur les menus
 * quand la base n'a pas encore ete alignee avec les derniers champs.
 */
try {
    $columnExistsStmt = $pdo->prepare(
        "SELECT COUNT(*) FROM information_schema.COLUMNS
         WHERE TABLE_SCHEMA = :schema_name
           AND TABLE_NAME = :table_name
           AND COLUMN_NAME = :column_name"
    );

    $hasColumn = static function (PDO $pdoRef, PDOStatement $stmt, string $db, string $table, string $column): bool {
        $stmt->execute([
            "schema_name" => $db,
            "table_name" => $table,
            "column_name" => $column,
        ]);
        return (int) $stmt->fetchColumn() > 0;
    };

    $addColumnIfMissing = static function (PDO $pdoRef, callable $hasColumnFn, string $db, string $table, string $column, string $definition) use ($columnExistsStmt): void {
        if (!$hasColumnFn($pdoRef, $columnExistsStmt, $db, $table, $column)) {
            $pdoRef->exec("ALTER TABLE {$table} ADD COLUMN {$column} {$definition}");
        }
    };

    $addColumnIfMissing($pdo, $hasColumn, $dbName, "stagiaires", "prenoms", "VARCHAR(150) NOT NULL DEFAULT ''");
    $addColumnIfMissing($pdo, $hasColumn, $dbName, "stagiaires", "sexe", "ENUM('M','F') DEFAULT NULL");
    $addColumnIfMissing($pdo, $hasColumn, $dbName, "stagiaires", "numero", "VARCHAR(50) DEFAULT NULL");
    $addColumnIfMissing($pdo, $hasColumn, $dbName, "stagiaires", "date_naissance", "DATE DEFAULT NULL");
    $addColumnIfMissing($pdo, $hasColumn, $dbName, "stagiaires", "lieu_naissance", "VARCHAR(150) DEFAULT NULL");

    $roleColumn = "role";
    if (!$hasColumn($pdo, $columnExistsStmt, $dbName, "utilisateurs", $roleColumn)) {
        $addColumnIfMissing(
            $pdo,
            $hasColumn,
            $dbName,
            "utilisateurs",
            $roleColumn,
            "ENUM('admin','secretaire','utilisateur') NOT NULL DEFAULT 'utilisateur'"
        );
    } else {
        $pdo->exec("UPDATE utilisateurs SET role = 'utilisateur' WHERE role = 'comptable'");
        $pdo->exec("ALTER TABLE utilisateurs MODIFY COLUMN role ENUM('admin','secretaire','utilisateur') NOT NULL DEFAULT 'utilisateur'");
    }

    // Si le compte admin principal existe, forcer son role "admin".
    $pdo->exec("UPDATE utilisateurs SET role = 'admin' WHERE email = 'admin@pis.local'");

    // Autoriser les titres de formation longs (sans limite pratique de VARCHAR).
    $pdo->exec("ALTER TABLE formations MODIFY titre TEXT NOT NULL");
} catch (Throwable $migrationError) {
    // On n'arrete pas l'application si la migration defensive echoue.
}
