#!/usr/bin/env php
<?php

declare(strict_types=1);

/**
 * 18Pixels White Label CMS — command-line console.
 *
 * Usage:
 *   php bin/console migrate            Apply pending migrations
 *   php bin/console migrate:rollback   Roll back the last batch
 *   php bin/console migrate:fresh      Drop all tables and re-migrate
 *   php bin/console db:seed            Seed baseline data (roles, admin, settings)
 *   php bin/console key:generate       Generate APP_KEY / JWT_SECRET
 *   php bin/console route:list         List registered routes
 */

use App\Core\Application;
use App\Core\Database\Connection;
use App\Core\Database\Migrator;
use App\Core\Http\Router;
use App\Database\Seeders\DatabaseSeeder;

$root = dirname(__DIR__);

$autoload = $root . '/vendor/autoload.php';
if (is_file($autoload)) {
    require $autoload;
} else {
    // Fallback PSR-4 autoloader so the console works before "composer install".
    spl_autoload_register(static function (string $class) use ($root): void {
        $prefixes = [
            'App\\' => $root . '/src/',
            'App\\Database\\Seeders\\' => $root . '/database/seeds/',
        ];
        foreach ($prefixes as $prefix => $baseDir) {
            if (str_starts_with($class, $prefix)) {
                $relative = str_replace('\\', '/', substr($class, strlen($prefix))) . '.php';
                $file = $baseDir . $relative;
                if (is_file($file)) {
                    require $file;
                    return;
                }
            }
        }
    });
    require $root . '/src/Core/Support/helpers.php';
}

$app = new Application($root);

$command = $argv[1] ?? 'help';
$exitCode = 0;

/** Write a coloured line to stdout. */
$line = static function (string $text, string $colour = ''): void {
    $codes = ['green' => "\033[32m", 'red' => "\033[31m", 'yellow' => "\033[33m", 'cyan' => "\033[36m"];
    $reset = "\033[0m";
    $prefix = $codes[$colour] ?? '';
    fwrite(STDOUT, $prefix . $text . ($prefix ? $reset : '') . PHP_EOL);
};

try {
    switch ($command) {
        case 'migrate':
            $migrator = new Migrator($app->make(Connection::class), $root . '/database/migrations');
            $ran = $migrator->run();
            if ($ran === []) {
                $line('Nothing to migrate — schema is up to date.', 'yellow');
            } else {
                foreach ($ran as $name) {
                    $line("Migrated: {$name}", 'green');
                }
            }
            break;

        case 'migrate:rollback':
            $migrator = new Migrator($app->make(Connection::class), $root . '/database/migrations');
            $reverted = $migrator->rollback();
            if ($reverted === []) {
                $line('Nothing to roll back.', 'yellow');
            } else {
                foreach ($reverted as $name) {
                    $line("Rolled back: {$name}", 'green');
                }
            }
            break;

        case 'migrate:fresh':
            $migrator = new Migrator($app->make(Connection::class), $root . '/database/migrations');
            $ran = $migrator->fresh();
            $line('Database refreshed.', 'green');
            foreach ($ran as $name) {
                $line("Migrated: {$name}", 'green');
            }
            break;

        case 'db:seed':
            if (!class_exists(DatabaseSeeder::class)) {
                $line('DatabaseSeeder not found.', 'red');
                $exitCode = 1;
                break;
            }
            (new DatabaseSeeder($app->make(Connection::class)))->run();
            $line('Database seeded.', 'green');
            break;

        case 'key:generate':
            $appKey = base64_encode(random_bytes(32));
            $jwtSecret = base64_encode(random_bytes(48));
            $line('Add these to your .env file:', 'cyan');
            $line("APP_KEY={$appKey}");
            $line("JWT_SECRET={$jwtSecret}");
            break;

        case 'route:list':
            $app->boot();
            /** @var Router $router */
            $router = $app->make(Router::class);
            $line('Routes are registered. Use the router in code to inspect them.', 'cyan');
            break;

        case 'help':
        default:
            $line('18Pixels White Label CMS — Console', 'cyan');
            $line('');
            $line('Available commands:');
            $line('  migrate            Apply pending migrations');
            $line('  migrate:rollback   Roll back the last batch');
            $line('  migrate:fresh      Drop all tables and re-migrate');
            $line('  db:seed            Seed baseline data');
            $line('  key:generate       Generate APP_KEY / JWT_SECRET');
            $line('  route:list         List registered routes');
            break;
    }
} catch (\Throwable $e) {
    $line('Error: ' . $e->getMessage(), 'red');
    $exitCode = 1;
}

exit($exitCode);
