<?php
namespace nur\v;

use nur\A;

/**
 * Class js: des outils pour générer des valeurs pour javascript
 */
class js {
  /** Quoter une partie de valeur chaine pour javascript. */
  static function q($value): string {
    $value = strval($value);
    $value = preg_replace("/\"/", "\\\\\"", $value);
    $value = preg_replace("/\n/", "\\\\n", $value);
    return $value;
  }

  /**
   * Quoter une valeur chaine pour javascript avec des double-quotes.
   *
   * @param bool $qa la valeur doit-elle être utilisée dans un attribut HTML?
   */
  static function qv($value, bool $qa=false): string {
    $value = strval($value);
    $value = preg_replace("/\"/", "\\\\\"", $value);
    $value = preg_replace("/\n/", "\\\\n", $value);
    $value = "\"$value\"";
    if ($qa) $value = htmlspecialchars($value);
    return $value;
  }

  /** méthode de convenance pour quoter un id "#id" */
  static function qid(string $id): string {
    return self::qv("#$id");
  }

  /** méthode de convenance pour quoter une classe ".class" */
  static function qclass(string $class): string {
    return self::qv(".$class");
  }

  /**
   * Quoter une valeur scalaire ou tableau pour javascript avec des double-quotes.
   *
   * @param bool $qa la valeur doit-elle être utilisée dans un attribut HTML?
   */
  static function qvs($values, bool $qa=false): string {
    if (A::is_array($values)) {
      $values = A::with($values);
      $jvalues = [];
      foreach($values as $value) {
        $jvalues[] = self::qv($value, $qa);
      }
      return "[".implode(", ", $jvalues)."]";
    } else {
      return self::qv($values, $qa);
    }
  }

  /**
   * Quoter une valeur chaine pour javascript avec des quotes simples "'".
   *
   * @param bool $qa la valeur doit-elle être utilisée dans un attribut HTML?
   */
  static function sqv($value, bool $qa=false): string {
    $value = strval($value);
    $value = preg_replace("/\"/", "\\\\\"", $value);
    $value = preg_replace("/\n/", "\\\\n", $value);
    $value = "'$value'";
    if ($qa) $value = htmlspecialchars($value);
    return $value;
  }

  /**
   * Quoter une valeur scalaire ou tableau pour javascript avec des quotes simples "'".
   *
   * @param bool $qa la valeur doit-elle être utilisée dans un attribut HTML?
   */
  static function sqvs($values, bool $qa=false): string {
    if (A::is_array($values)) {
      $values = A::with($values);
      $jvalues = [];
      foreach($values as $value) {
        $jvalues[] = self::sqv($value, $qa);
      }
      return "[".implode(", ", $jvalues)."]";
    } else {
      return self::sqv($values, $qa);
    }
  }

  /** sérialiser une valeur objet */
  static function qo($values): string {
    $parts = [];
    if ($values !== null) {
      $first = true;
      foreach ($values as $key => $value) {
        if ($first) $first = false;
        else $parts[] = ",";
        $parts[] = self::qv($key);
        $parts[] = ":";
        $parts[] = json_encode($value, JSON_THROW_ON_ERROR);
      }
    }
    return "{".implode("", $parts)."}";
  }

  /** sérialiser une valeur booléenne */
  static function qb($value): string {
    return $value? "true": "false";
  }
}
