<?php
namespace nur;

/**
 * Class debug: outils pour afficher des valeurs dans les logs à des fins de
 * débuggage
 */
class debug {
  /** afficher telles quelles les valeurs des variables dans le flux HTML */
  static final function outv(...$values): void {
    echo "<!--\n";
    foreach ($values as $value) {
      var_export($value);
    }
    echo "\n-->\n";
  }

  /** afficher telles quelles les valeurs des variables dans les logs d'erreurs */
  static final function logv(...$values): void {
    foreach ($values as $value) {
      error_log(var_export($value, true));
    }
  }

  /**
   * Formatter une liste de valeurs, et retourner une liste de lignes.
   *
   * Une valeur qui commence par "\n" provoque un retour à la ligne. Sinon, les
   * valeurs sont retournées telles quelles.
   */
  static final function format_values(...$values): array {
    $lines = [];
    $parts = [];
    foreach ($values as $value) {
      if (is_string($value)) {
        if (substr($value, 0, 1) == "\n") {
          if ($parts) $lines[] = implode(" ", $parts);
          $parts = [];
          $value = substr($value, 1);
          if (!$value) continue;
        }
        $parts[] = $value;
      } else {
        $parts[] = var_export($value, true);
      }
    }
    if ($parts) $lines[] = implode(" ", $parts);
    return $lines;
  }

  /**
   * afficher un message composé de la valeur de plusieurs variables dans le
   * flux HTML.
   */
  static final function out(...$values): void {
    $lines = self::format_values(...$values);
    if ($lines) {
      echo "<!--\n";
      echo implode("\n", $lines);
      echo "\n-->\n";
    }
  }

  /**
   * S'assurer que chaque ligne ne contient pas "\n", ce qui permet de les
   * afficher correctement dans les logs
   */
  static final function split_lines($lines): array {
    $parts = [];
    foreach ($lines as $line) {
      $parts[] = explode("\n", $line);
    }
    return array_merge(...$parts);
  }

  /**
   * afficher un message composé de la valeur de plusieurs variables dans les
   * logs d'erreur. Une chaine "\n" permet de séparer les groupes de valeurs
   */
  static final function log(...$values): void {
    $lines = self::format_values(...$values);
    $lines = self::split_lines($lines);
    #if ($lines) error_log(implode("\n", $lines));
    # afficher chaque ligne à part; c'est plus lisible...
    foreach ($lines as $line) {
      error_log($line);
    }
  }

  /** afficher un message dans les logs d'erreurs uniquement si on est en mode DEBUG */
  static final function logm(...$values): void {
    if (config::is_debug()) self::log(...$values);
  }
}
