<?php
/**
 * Migration runner — rulează automat la fiecare conexiune nouă (via db()).
 *
 * Convenție pentru fișierele din migrations/:
 *   - numele: NNN_descriere.php  (ex: 001_init.php, 002_add_brand_to_products.php)
 *   - conținut: <?php return function (PDO $db): void { $db->exec("..."); };
 *
 * Adăugarea unui fișier nou e suficientă — la următorul request va rula automat.
 */

function migrate_run(PDO $db): void
{
    // Tabelul de tracking
    $db->exec("CREATE TABLE IF NOT EXISTS migrations (
        name       TEXT PRIMARY KEY,
        applied_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
    )");

    $applied = [];
    foreach ($db->query("SELECT name FROM migrations") as $row) {
        $applied[$row['name']] = true;
    }

    $files = glob(MIGRATIONS_PATH . '/*.php') ?: [];
    sort($files, SORT_NATURAL);

    foreach ($files as $file) {
        $name = basename($file, '.php');
        if (isset($applied[$name])) {
            continue;
        }

        $migration = require $file;
        if (!is_callable($migration)) {
            throw new RuntimeException("Migrația $name trebuie să returneze un callable.");
        }

        $db->beginTransaction();
        try {
            $migration($db);
            $stmt = $db->prepare("INSERT INTO migrations (name) VALUES (?)");
            $stmt->execute([$name]);
            $db->commit();
            error_log("[Migrate] Applied: $name");
        } catch (Throwable $e) {
            $db->rollBack();
            throw new RuntimeException("Migrația $name a eșuat: " . $e->getMessage(), 0, $e);
        }
    }
}
