#!/usr/bin/php
<?php
require $_composer_autoload_path?? __DIR__.'/../vendor/autoload.php';

use nur\b\IllegalAccessException;
use nur\cli\Application;
use nur\b\date\Datetime;
use nur\data\types\SDatetimeType;

Application::run(new class extends Application {
  const TIMESTAMP = 0;
  const DATETIME = 1;

  const ARGS = [
    "purpose" => "analyser une date source et la convertir dans un format destination",
    "usage" => "[-t|-d] SOURCES...",
    ["--st", "--timestamp", "name" => "input_format", "value" => self::TIMESTAMP,
      "help" => "la source est un timestamp",
    ],
    ["--sd", "--datetime", "name" => "input_format", "value" => self::DATETIME,
      "help" => "la source est une date",
    ],
    ["-t", "--show-timestamp", "name" => "output_format", "value" => self::TIMESTAMP,
      "help" => "afficher le timestamp",
    ],
    ["-d", "--show-datetime", "name" => "output_format", "value" => self::DATETIME,
      "help" => "afficher la date",
    ],
  ];

  private $inputFormat;
  private $outputFormat;

  private $args;

  private function getOutputFormat(int $inputFormat): int {
    switch ($inputFormat) {
    case self::TIMESTAMP: return self::DATETIME;
    case self::DATETIME: return self::TIMESTAMP;
    default: throw IllegalAccessException::unexpected_state();
    }
  }
  private function setFormats(string $arg, ?int &$inputFormat, ?int &$outputFormat): void {
    if ($this->inputFormat !== null) {
      $inputFormat = $this->inputFormat;
    } elseif (preg_match('/^\d+$/', $arg)) {
      # s'il n'y a que des chiffres, c'est un timestamp
      $inputFormat = self::TIMESTAMP;
    } else {
      $inputFormat = self::DATETIME;
    }
    if ($this->outputFormat !== null) $outputFormat = $this->outputFormat;
    else $outputFormat = $this->getOutputFormat($inputFormat);
  }

  function main() {
    $dt = new SDatetimeType();
    $input = null;
    foreach ($this->args as $arg) {
      $this->setFormats($arg, $inputFormat, $outputFormat);
      switch ($inputFormat) {
      case self::TIMESTAMP:
        $input = new Datetime(intval($arg));
        break;
      case self::DATETIME:
        $input = new Datetime($dt->with($arg));
      }
      switch ($outputFormat) {
      case self::TIMESTAMP:
        $output = $input->getTime();
        break;
      case self::DATETIME:
        $output = $input->format();
        break;
      }
      echo "$output\n";
    }
  }
});