<?php
namespace nur\v;

use nur\str;
use nur\v\base\RouteManager;
use nur\v\model\IPage;
use nur\v\model\IRouteManager;

/**
 * Class route: gestion globale des routes
 */
class route {
  const MANAGER_CLASS = RouteManager::class;

  protected static $manager_class;

  /**
   * spécifier la classe à utiliser pour instancier le gestionnaire de routes
   *
   * cette méthode *doit* être appelée avant d'appeler la méthode
   * {@link manager()}
   */
  static final function set_manager_class(string $manager_class) {
    self::$manager_class = $manager_class;
  }

  /** @var IRouteManager */
  protected static $manager;

  static final function set_manager(IRouteManager $manager) {
    self::$manager = $manager;
  }

  /** obtenir l'instance globale de gestionnaire de route */
  static final function manager(): IRouteManager {
    if (self::$manager === null) {
      $manager_class = self::$manager_class;
      if ($manager_class === null) $manager_class = static::MANAGER_CLASS;
      self::$manager = new $manager_class();
    }
    return self::$manager;
  }

  static final function __callStatic($name, $args) {
    $name = str::us2camel($name);
    return call_user_func_array([self::manager(), $name], $args);
  }

  #############################################################################

  const MODE_EXACT = IRouteManager::MODE_EXACT;
  const MODE_PREFIX = IRouteManager::MODE_PREFIX;
  const MODE_PACKAGE = IRouteManager::MODE_PACKAGE;
  const MODE_PACKAGE2 = IRouteManager::MODE_PACKAGE2;

  static final function add(array ...$routes): void { self::manager()->addRoute(...$routes); }
  static final function set_error($page): void { self::manager()->setErrorPage($page); }

  static final function get_page(?string $path=null): IPage { return self::manager()->getPage($path); }
  static final function get_path($page): string { return self::manager()->getPath($page); }
}