<?php
namespace nur\sery\web\params;

use nur\sery\str;

/**
 * Class F: gestion unifiée des paramètres POST + GET
 */
class F {
  /** tester si le paramètre $name existe dans $_POST ou $_GET */
  static final function has($name): bool {
    if ($name === null || $name === false) return false;
    elseif (array_key_exists($name, $_POST)) return true;
    elseif (array_key_exists($name, $_GET)) return true;
    else return false;
  }

  /** obtenir le paramètre $name en cherchant dans $_POST puis $_GET */
  static final function get($name, $default=null, bool $trim=false) {
    if ($name === null || $name === false) $value = $default;
    elseif (array_key_exists($name, $_POST)) $value = $_POST[$name];
    elseif (array_key_exists($name, $_GET)) $value = $_GET[$name];
    else $value = $default;
    if ($trim) $value = str::trim($value);
    return $value;
  }

  /**
   * modifier le paramètre.
   *
   * - s'il provenait de $_POST, modifier $_POST
   * - s'il provenait de $_GET, modifier $_GET
   * - sinon modifier $_POST
   */
  static final function set(string $name, ?string $value): void {
    if (array_key_exists($name, $_POST)) $_POST[$name] = $value;
    elseif (array_key_exists($name, $_GET)) $_GET[$name] = $value;
    else $_POST[$name] = $value;
  }

  /** obtenir la liste des clés définies dans les paramètres */
  protected static final function get_names(): array {
    return array_keys(array_merge(
      array_fill_keys(array_keys($_POST), true),
      array_fill_keys(array_keys($_GET), true),
    ));
  }

  /**
   * retourner une liste des paramètres qui ont été passés, en les sélectionnant
   * selon le contenu de $includes et $excludes. ensuite, fusionner le tableau
   * $merge s'il est spécifié
   *
   * pour être sélectionné, un paramètre ne doit pas être dans $excludes, et si
   * $includes n'est pas null, doit être dans $includes
   */
  static final function select(?array $includes=null, ?array $excludes=null, ?array $merges=null): array {
    $params = [];
    foreach (self::get_names() as $name) {
      if ($excludes !== null && in_array($name, $excludes)) continue;
      if ($includes !== null && !in_array($name, $includes)) continue;
      $params[$name] = self::get($name);
    }
    if ($merges !== null) $params = array_merge($params, $merges);
    return $params;
  }
}
