<?php
namespace nur\sery\php;

use ArrayAccess;
use nur\sery\str;

/**
 * Class valm: frontend pour accéder à une propriété d'un objet (par une méthode
 * normalisée ou en direct) ou à la clé d'un tableau. cette classe utilise
 * {@link mprop} ou {@link akey} en fonction de la nature de la cible
 *
 * si la cible est un objet, les noms des clés sont transformés en camelCase
 * pour avoir les propriétés correspondantes
 */
class valm {
  static final function get($src, $name, $default=null) {
    if (is_object($src) && !($src instanceof ArrayAccess)) {
      $name = str::us2camel($name);
      return mprop::get($src, $name, $default);
    } else {
      return akey::get($src, $name, $default);
    }
  }

  static final function set(&$dest, $name, $value) {
    if (is_object($dest) && !($dest instanceof ArrayAccess)) {
      $name = str::us2camel($name);
      return mprop::set($dest, $name, $value);
    } else {
      return akey::set($dest, $name, $value);
    }
  }

  /**
   * initialiser $dest avec les valeurs de $values
   *
   * si $dest est un objet, les noms des clés sont transformées en camelCase
   * pour avoir les propriétés correspondantes
   */
  static final function set_values(&$dest, ?array $values): void {
    if ($values === null) return;
    if (is_object($dest) && !($dest instanceof ArrayAccess)) {
      mprop::set_values($dest, $values);
    } else {
      akey::set_values($dest, $values);
    }
  }

  static final function inc(&$dest, $name): int {
    if (is_object($dest) && !($dest instanceof ArrayAccess)) {
      $name = str::us2camel($name);
      return mprop::inc($dest, $name);
    } else {
      return akey::inc($dest, $name);
    }
  }

  static final function dec(&$dest, $name): int {
    if (is_object($dest) && !($dest instanceof ArrayAccess)) {
      $name = str::us2camel($name);
      return mprop::dec($dest, $name);
    } else {
      return akey::dec($dest, $name);
    }
  }

  static final function merge(&$dest, $name, $merge): void {
    if (is_object($dest) && !($dest instanceof ArrayAccess)) {
      $name = str::us2camel($name);
      mprop::merge($dest, $name, $merge);
    } else {
      akey::merge($dest, $name, $merge);
    }
  }

  static final function append(&$dest, $name, $value): void {
    if (is_object($dest) && !($dest instanceof ArrayAccess)) {
      $name = str::us2camel($name);
      mprop::append($dest, $name, $value);
    } else {
      akey::append($dest, $name, $value);
    }
  }
}
