#!/usr/bin/php
<?php
$internalUse = $argv[1] ?? null;
if ($internalUse !== "--internal-use") exit("Wrong args");
$paramsfile = $argv[2] ?? null;
if (!file_exists($paramsfile)) exit("Bad params file");
$argc -= 2;
$argv = array_merge(
  array_slice($argv, 0, 1),
  array_slice($argv, 3),
);

$app_params = unserialize(file_get_contents($paramsfile));
@unlink($paramsfile);
require $app_params["vendor"]["autoload"];

use nur\cli\Application;
use nur\sery\output\msg;
use nur\sery\wip\app\app;
use nur\sery\app\launcher;
use nur\yaml;

class _LaunchApp extends Application {
  const NAME = "_launch";
  const USE_LOGFILE = true;

  const ACTION_INFOS = 0, ACTION_START = 1, ACTION_STOP = 2;

  const ARGS = [
    "merge" => parent::ARGS,
    "purpose" => "lancer une tâche de fond",
    "usage" => "ApplicationClass args...",

    ["-s", "--start", "name" => "action", "value" => self::ACTION_START,
      "help" => "démarrer la tâche, c'est la valeur par défaut"
    ],
    ["-k", "--stop", "name" => "action", "value" => self::ACTION_STOP,
      "help" => "arrêter la tâche"
    ],
    ["-i", "--infos", "name" => "action", "value" => self::ACTION_INFOS,
      "help" => "afficher des informations sur la tâche"
    ],
  ];

  protected $action = self::ACTION_START;

  protected $args;

  function main() {
    $appClass = $this->args[0] ?? null;
    if ($appClass === null) {
      msg::error("Vous devez spécifier la classe de l'application");
      self::die();
    } elseif (!class_exists($appClass)) {
      msg::error("$appClass: Cette classe n'existe pas");
      self::die();
    }
    $args = array_slice($this->args, 1);

    $useRunfile = constant("$appClass::USE_RUNFILE");
    if (!$useRunfile) {
      msg::error("Cette application ne supporte pas l'usage de runfile");
      self::die();
    }

    $runfile = app::with($appClass, self::$internal_use_app_params)->getRunfile();
    switch ($this->action) {
    case self::ACTION_START:
      launcher::_start($args, $runfile);
      break;
    case self::ACTION_STOP:
      launcher::_stop($runfile);
      break;
    case self::ACTION_INFOS:
      yaml::dump($runfile->read());
      break;
    }
  }
}
_LaunchApp::internal_use_set_app_params($app_params);
_LaunchApp::run();
