#!/usr/bin/env php
<?php
/**
 * Database Seeder CLI
 *
 * Uso:
 *   php bin/seed               - Ejecutar todas las semillas (ordenadas por $order)
 *   php bin/seed RolesSeeder   - Ejecutar una semilla específica
 *   php bin/seed --list        - Listar semillas disponibles
 *   php bin/seed --help        - Mostrar ayuda
 *
 * Para crear una nueva semilla:
 *   1. Crear archivo en database/seeders/ (ej: MiModuloSeeder.php)
 *   2. Extender Seeder e implementar run()
 *   3. Listo. No hay que tocar este archivo.
 */

$basePath = dirname(__DIR__);
define('BASE_PATH', $basePath . '/');

require $basePath . '/core/helpers/Env.php';
Env::load($basePath . '/.env');

// ── Cargar base y runner ──────────────────────────────────────────
require $basePath . '/database/Seeder.php';
require $basePath . '/database/SeederRunner.php';

// ── Argumentos CLI ────────────────────────────────────────────────
$arg = $argv[1] ?? null;

if ($arg === '--help' || $arg === '-h') {
    echo <<<HELP

  Klee Core — Database Seeder
  ────────────────────────────
  php bin/seed               Run all seeders (sorted by \$order)
  php bin/seed RolesSeeder   Run a specific seeder
  php bin/seed --list        List available seeders
  php bin/seed --help        Show this help

  To create a new seeder:
    1. Create file in database/seeders/ (e.g. MyModuleSeeder.php)
    2. Extend Seeder, set \$order, implement run()
    3. Done — no registration needed.

HELP;
    exit(0);
}

// ── Conexión a BD ─────────────────────────────────────────────────
if (file_exists($basePath . '/app/config/Config.php')) {
    require $basePath . '/app/config/Config.php';
}
if (file_exists($basePath . '/app/config/ConfigEnv.php')) {
    require $basePath . '/app/config/ConfigEnv.php';
}

$dbConfig = null;
if (class_exists('ConfigEnv') && property_exists('ConfigEnv', 'DB_CONNECTIONS')) {
    $connections = ConfigEnv::$DB_CONNECTIONS;
    if (isset($connections['klee'])) {
        $dbConfig = $connections['klee'];
    }
}

if (!$dbConfig) {
    $dbConfig = [
        'driver' => getenv('DB_DRIVER') ?: 'mysql',
        'host'   => getenv('DB_HOST')   ?: 'localhost',
        'dbname' => getenv('DB_NAME')   ?: 'klee_core',
        'user'   => getenv('DB_USER')   ?: 'root',
        'password' => getenv('DB_PASS') ?: '',
    ];
}

if (empty($dbConfig['host']) || empty($dbConfig['dbname']) || empty($dbConfig['user'])) {
    echo "Error: Database configuration not found.\n";
    echo "Set DB_HOST, DB_NAME, DB_USER env vars, or check app/config/ConfigEnv.php\n";
    exit(1);
}

try {
    // $dsn = "{$dbConfig['driver']}:host={$dbConfig['host']};dbname={$dbConfig['dbname']};charset=utf8mb4";
    $dsn = "mysql:host={$dbConfig['host']};port={$dbConfig['port']};dbname={$dbConfig['dbname']};charset=utf8mb4";
    $pdo = new PDO($dsn, $dbConfig['user'], $dbConfig['password']);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    echo "Database connection error: " . $e->getMessage() . "\n";
    exit(1);
}

// ── Ejecutar ──────────────────────────────────────────────────────
$runner = new SeederRunner($pdo, $basePath . '/database/seeders');

$recordSeedRun = function ($mode, $name = null) use ($basePath) {
    $cacheDir = $basePath . '/storage/cache';
    if (!is_dir($cacheDir)) {
        @mkdir($cacheDir, 0755, true);
    }

    $payload = array(
        'mode' => (string)$mode,
        'name' => $name !== null ? (string)$name : null,
        'executed_at' => date('Y-m-d H:i:s'),
    );

    @file_put_contents($cacheDir . '/last_seed.json', json_encode($payload, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
};

try {
    if ($arg === '--list' || $arg === '-l') {
        $runner->list();
    } elseif ($arg && !str_starts_with($arg, '-')) {
        $runner->runOne($arg);
        $recordSeedRun('single', $arg);
    } else {
        $runner->runAll();
        $recordSeedRun('all', 'ALL_SEEDERS');
    }
} catch (Exception $e) {
    echo "[✗] Error: " . $e->getMessage() . "\n";
    exit(1);
}

echo "\n";
exit(0);
