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

declare(strict_types=1);

use App\Cli\CliException;
use App\Cli\Command\InitCommand;
use App\Cli\Command\PullCommand;
use App\Cli\Command\PushCommand;
use App\Cli\Command\StatusCommand;
use Symfony\Component\Console\Application;
use Symfony\Component\Console\Output\ConsoleOutput;
use Symfony\Component\Console\Output\OutputInterface;

/*
 * Point d'entrée du CLI.
 *
 * Volontairement INDÉPENDANT du kernel Symfony : ni conteneur, ni Doctrine, ni
 * base de données. Ce binaire tourne sur la machine d'un développeur d'une
 * application cliente, pas sur le serveur — il n'a rien à savoir de
 * l'infrastructure de TQ-Slator, seulement parler HTTP.
 *
 * Bénéfice concret : démarrage en quelques millisecondes, et aucune raison
 * d'échouer parce qu'une variable d'environnement du serveur manque.
 */

// Dans le PHAR, le stub a déjà chargé l'autoloader dédié — le test porte sur le
// contexte d'exécution, pas sur une classe : à ce stade rien n'est encore
// chargé, seul un autoloader est enregistré.
if ('' === Phar::running(false)) {
    foreach ([__DIR__.'/../vendor/autoload.php', __DIR__.'/../../../autoload.php'] as $autoload) {
        if (is_file($autoload)) {
            require $autoload;

            break;
        }
    }
}

$application = new Application('tqs', '1.0.0');
$application->setCatchExceptions(false);
$application->addCommands([
    new InitCommand(),
    new PushCommand(),
    new PullCommand(),
    new StatusCommand(),
]);

$output = new ConsoleOutput();

try {
    exit($application->run(null, $output));
} catch (CliException $exception) {
    // Erreur attendue : le message a été rédigé pour être lu. Pas de trace —
    // une pile d'appels devant « exportez TQS_API_KEY » n'aide personne.
    $output->getErrorOutput()->writeln(['', '<error> Erreur </error>', '', $exception->getMessage(), '']);

    exit(1);
} catch (Throwable $exception) {
    $errors = $output->getErrorOutput();
    $errors->writeln(['', '<error> Erreur inattendue </error>', '', $exception->getMessage(), '']);

    if ($errors->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE) {
        $errors->writeln($exception->getTraceAsString());
    } else {
        $errors->writeln('<comment>Relancez avec -v pour la trace complète.</comment>');
        $errors->writeln('');
    }

    exit(1);
}
