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

if (php_sapi_name() !== 'cli') exit;

// cli agent is used also in 'Installer/template/hubleto'
if (!isset($config) || !is_array($config)) $config = [];

$config['sessionSalt'] = 'hubleto-cli-agent';

$hubleto = new \Hubleto\Erp\Loader($config);
$hubleto->init();

// MAIN code

$hubleto->terminal()->green("Hubleto CLI agent (release [" . \Composer\InstalledVersions::getPrettyVersion("hubleto/erp") . "]).\n");

$action = (string) ($argv[1] ?? '');

if (!empty($action)) {
  try {
    $command = null;
    switch ($action) {
      case 'help': $command = $hubleto->getService(\Hubleto\Erp\Cli\Agent\CommandHelp::class)->setArguments($argv); break;
      case 'init': $command = $hubleto->getService(\Hubleto\Erp\Cli\Agent\CommandInit::class)->setArguments($argv); break;
      case 'migrate': $command = $hubleto->getService(\Hubleto\Erp\Cli\Agent\CommandMigrate::class)->setArguments($argv); break;
      case 'prepare-composer': $command = $hubleto->getService(\Hubleto\Erp\Cli\Agent\CommandPrepareComposer::class)->setArguments($argv); break;
      case 'app':
        switch ($argv[2]) {
          case 'list': $command = $hubleto->getService(\Hubleto\Erp\Cli\Agent\App\ListInstalled::class)->setArguments($argv); break;
          case 'install': $command = $hubleto->getService(\Hubleto\Erp\Cli\Agent\App\Install::class)->setArguments($argv); break;
          case 'disable': $command = $hubleto->getService(\Hubleto\Erp\Cli\Agent\App\Disable::class)->setArguments($argv); break;
          case 'reset-all': $command = $hubleto->getService(\Hubleto\Erp\Cli\Agent\App\ResetAll::class)->setArguments($argv); break;
          case 'create': $command = $hubleto->getService(\Hubleto\Erp\Cli\Agent\App\Create::class)->setArguments($argv); break;
        }
      break;
      case 'debug':
        switch ($argv[2]) {
          case 'test-oauth': $command = $hubleto->getService(\Hubleto\Erp\Cli\Agent\Debug\TestOauth::class)->setArguments($argv); break;
          case 'router': $command = $hubleto->getService(\Hubleto\Erp\Cli\Agent\Debug\Router::class)->setArguments($argv); break;
        }
      break;
      case 'create':
        switch ($argv[2]) {
          case 'app': $command = $hubleto->getService(\Hubleto\Erp\Cli\Agent\App\Create::class)->setArguments($argv); break;
          case 'model': $command = $hubleto->getService(\Hubleto\Erp\Cli\Agent\Create\Model::class)->setArguments($argv); break;
          case 'controller': $command = $hubleto->getService(\Hubleto\Erp\Cli\Agent\Create\Controller::class)->setArguments($argv); break;
          case 'view': $command = $hubleto->getService(\Hubleto\Erp\Cli\Agent\Create\View::class)->setArguments($argv); break;
          case 'mvc': $command = $hubleto->getService(\Hubleto\Erp\Cli\Agent\Create\TableFormViewAndController::class)->setArguments($argv); break;
          case 'api': $command = $hubleto->getService(\Hubleto\Erp\Cli\Agent\Create\ApiEndpoint::class)->setArguments($argv); break;
          case 'migration': $command = $hubleto->getService(\Hubleto\Erp\Cli\Agent\Create\Migration::class)->setArguments($argv); break;
        }
      break;
      case 'project':
        switch ($argv[2]) {
          case 'init': $command = $hubleto->getService(\Hubleto\Erp\Cli\Agent\CommandInit::class)->setArguments($argv); break;
          case 'generate-demo-data': $command = $hubleto->getService(\Hubleto\Erp\Cli\Agent\Project\GenerateDemoData::class)->setArguments($argv); break;
        }
      break;
    }

    if ($command === null) {
      $hubleto->terminal()->red("Don't know what to do.\n");
    } else {
      $command->run();
    }
  } catch (\Throwable $e) {
    $hubleto->terminal()->red("{$e->getMessage()}\n");
    $hubleto->terminal()->red($e->getTraceAsString()."\n");
  }
} else {
  $hubleto->terminal()->green("Usage: php hubleto <command>\n");
  $hubleto->terminal()->green("Example: php hubleto help\n");
}
