<?php
namespace nur\sery\output;

use nur\sery\cl;
use nur\sery\ValueException;
use nur\sery\output\std\ProxyMessenger;

/**
 * Class log: inscrire un message dans les logs uniquement
 *
 * Cette classe (ou la classe parallèle {@link msg} DOIT être initialisée avant
 * d'être utilisée
 */
class log extends _messenger {
  static function set_messenger(IMessenger $log=null) {
    self::$log = $log;
    // forcer la recréation de l'instance partagée $msg
    self::$msg = null;
  }

  static function set_messenger_class(string $log_class=null, ?array $params=null) {
    if (!is_subclass_of($log_class, IMessenger::class)) {
      throw ValueException::invalid_class($log_class, IMessenger::class);
    }
    self::set_messenger(new $log_class($params));
  }

  static function get(): IMessenger {
    if (self::$msg === null) {
      $msg = self::$log;
      if ($msg === null) $msg = new ProxyMessenger();
      self::$msg = $msg;
    }
    return self::$msg;
  }

  static function have_log(): bool {
    return self::$log !== null;
  }

  static function create_or_reset_params(?array $params=null, string $log_class=null, ?array $create_params=null) {
    if (self::$log === null) {
      $params = cl::merge($params, $create_params);
      self::set_messenger_class($log_class, $params);
    } else {
      self::reset_params($params);
    }
  }
}
