<?php
namespace nur;

use ArrayAccess;

/**
 * Class valx: frontend pour accéder à une propriété d'un objet ou à la clé
 * d'un tableau. cette classe utilise {@link oprop} 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 valx {
  static final function get($src, $name, $default=null) {
    if (is_object($src) && !($src instanceof ArrayAccess)) {
      $name = str::us2camel($name);
      return oprop::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 oprop::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)) {
      oprop::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 oprop::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 oprop::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);
      oprop::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);
      oprop::append($dest, $name, $value);
    } else {
      akey::append($dest, $name, $value);
    }
  }
}