#!/usr/bin/env php
<?php
/**
 * Point d'entrée une-commande du harness E2E (socle alcyon/e2e).
 *
 *   php vendor/bin/e2e [options]
 *
 * Options :
 *   --filter=<motif>   filtre PHPUnit (ex. --filter=Scenario02)
 *   --skip-db-reset    ne reconstruit pas les bases (itération rapide)
 *   --keep-services    laisse les serveurs actifs après le run
 *   --force            libère les ports occupés par un run précédent
 *   --timeout=<sec>    timeout global (défaut 900)
 *   --config=<chemin>  e2e.yaml explicite (sinon découverte automatique)
 *
 * Toute la configuration (services, bases, process, rapports) vit dans
 * `e2e.yaml` : ce script ne contient AUCUNE spécificité produit.
 */

declare(strict_types=1);

// Autoload. Attention : quand le package est installé en « path repository »,
// vendor/alcyon/e2e est un lien symbolique et __DIR__ pointe vers le dépôt du
// package, pas vers le vendor du produit. Le répertoire courant (racine du
// produit, d'où la commande est lancée) est donc la piste la plus fiable.
$autoloadFound = false;
foreach ([
    getcwd().'/vendor/autoload.php',
    __DIR__.'/../../../autoload.php',
    __DIR__.'/../vendor/autoload.php',
] as $candidate) {
    if (is_file($candidate)) {
        require $candidate;
        $autoloadFound = true;
        break;
    }
}
if (!$autoloadFound) {
    fwrite(STDERR, "Autoloader introuvable — lancer depuis la racine du produit (composer install requis).\n");
    exit(1);
}

use Alcyon\E2E\Config\HarnessConfig;
use Alcyon\E2E\Orchestration\Orchestrator;

$options = ['timeout' => 900];
$configPath = null;

foreach (array_slice($argv, 1) as $arg) {
    if (str_starts_with($arg, '--filter=')) {
        $options['filter'] = substr($arg, 9);
    } elseif ($arg === '--skip-db-reset') {
        $options['skip_db_reset'] = true;
    } elseif ($arg === '--keep-services') {
        $options['keep_services'] = true;
    } elseif ($arg === '--force') {
        $options['force'] = true;
    } elseif (str_starts_with($arg, '--timeout=')) {
        $options['timeout'] = (int) substr($arg, 10);
    } elseif (str_starts_with($arg, '--config=')) {
        $configPath = substr($arg, 9);
    } elseif (in_array($arg, ['-h', '--help'], true)) {
        fwrite(STDOUT, file_get_contents(__FILE__, false, null, 0, 1200));
        exit(0);
    } else {
        fwrite(STDERR, "Option inconnue : {$arg}\n");
        exit(2);
    }
}

$baseDir = getcwd();
$config = $configPath
    ? HarnessConfig::fromFile($configPath)
    : HarnessConfig::discover($baseDir);

echo "\n============================================================\n";
echo "  Tests E2E multi-services (socle alcyon/e2e)\n";
if (!empty($options['filter'])) {
    echo "  FILTRE : {$options['filter']}\n";
}
echo "============================================================\n";

try {
    exit((new Orchestrator($config, $baseDir))->run($options));
} catch (\Throwable $e) {
    fwrite(STDERR, "\n  [ERR] ".$e->getMessage()."\n");
    exit(1);
}
