<?php
namespace nur\ref;

use nur\data\types\Metadata;
use nur\md;
use nur\sery\os\file\file;
use nur\sery\php\content\c;

/**
 * Class ref_type: référence des types utilisables dans les schémas
 */
class ref_type {
  /**
   * type des données quelconques. la différence avec {@link MIXED}
   * est qu'une valeur false est équivalent à "non spécifié"
   */
  const ANY = null;

  /**
   * type des données quelconques que l'on prend en l'état, sans
   * aucun traitement supplémentaire
   */
  const MIXED = "mixed";

  /** valeur booléenne */
  const BOOL = "bool";

  /** valeur 3 états: true, false, null */
  const TRIBOOL = "tribool";

  /** entier */
  const INT = "int";

  /** flottant */
  const FLOAT = "float";

  /** chaine d'octets en l'état */
  const RAWSTRING = "rawstring";

  /** chaine d'octets trimmée et normalisée */
  const STRING = "string";

  /** chaine encodée en utf-8 trimmée et normalisée */
  const TEXT = "text";

  /** clé de tableau: string ou int */
  const KEY = "key";

  /** contenu à afficher: string ou array */
  const CONTENT = "content";

  /** information de fichier uploadé récupéré depuis $_FILES */
  const FILE = "file";

  /** date et heure */
  const DATETIME = "datetime";

  /** date */
  const DATE = "date";

  /** heure */
  const TIME = "time";

  /** heure sans les secondes */
  const HOUR = "hour";

  /** tableau de valeurs quelconques ou "objet" */
  const ARRAY = "array";

  /** tableau de tableaux ou d'objets */
  const ARRAY_ARRAY = "array[]";

  /** tableau ou objet iterable */
  const ITERABLE = "iterable";

  /** resource */
  const RESOURCE = "resource";

  /** comme {@link MIXED} mais nullable */
  const NMIXED = "?".self::MIXED;

  /** comme {@link BOOL} mais nullable */
  const NBOOL = "?".self::BOOL;

  /** alias de {@link TRIBOOL} qui est déjà nullable */
  const NTRIBOOL = "?".self::TRIBOOL;

  /** comme {@link INT} mais nullable */
  const NINT = "?".self::INT;

  /** comme {@link FLOAT} mais nullable */
  const NFLOAT = "?".self::FLOAT;

  /** comme {@link RAWSTRING} mais nullable */
  const NRAWSTRING = "?".self::RAWSTRING;

  /** comme {@link STRING} mais nullable */
  const NSTRING = "?".self::STRING;

  /** comme {@link TEXT} mais nullable */
  const NTEXT = "?".self::TEXT;

  /** comme {@link KEY} mais nullable */
  const NKEY = "?".self::KEY;

  /** comme {@link c} mais nullable */
  const NCONTENT = "?".self::CONTENT;

  /** comme {@link \nur\sery\FILE} mais nullable */
  const NFILE = "?".self::FILE;

  /** comme {@link DATETIME} mais nullable */
  const NDATETIME = "?".self::DATETIME;

  /** comme {@link DATE} mais nullable */
  const NDATE = "?".self::DATE;

  /** comme {@link TIME} mais nullable */
  const NTIME = "?".self::TIME;

  /** comme {@link HOUR} mais nullable */
  const NHOUR = "?".self::HOUR;

  /** comme {@link ARRAY} mais nullable */
  const NARRAY = "?".self::ARRAY;

  /** comme {@link ARRAY_ARRAY} mais nullable */
  const NARRAY_ARRAY = "?".self::ARRAY_ARRAY;

  /** comme {@link ITERABLE} mais nullable */
  const NITERABLE = "?".self::ITERABLE;

  /** comme {@link RESOURCE} mais nullable */
  const NRESOURCE = "?".self::RESOURCE;

  const ALIASES = [
    "boolean" => self::BOOL,
    "trib" => self::TRIBOOL,
    "integer" => self::INT,
    "flt" => self::FLOAT,
    "double" => self::FLOAT, "dbl" => self::FLOAT,
    "rawstr" => self::RAWSTRING,
    "str" => self::STRING,
    "txt" => self::TEXT,
    # nullable
    "?boolean" => self::NBOOL,
    "?trib" => self::NTRIBOOL,
    "?integer" => self::NINT,
    "?flt" => self::NFLOAT,
    "?double" => self::NFLOAT, "?dbl" => self::NFLOAT,
    "?rawstr" => self::NRAWSTRING,
    "?str" => self::NSTRING,
    "?txt" => self::NTEXT,
  ];

  /**
   * @var array types connus, bénéficiant d'un traitement standard que ce soit
   * avec {@link Metadata} ou {@link md}
   */
  const KNOWN_TYPES = [
    self::ANY,
    self::MIXED,
    self::BOOL,
    self::INT,
    self::FLOAT,
    self::RAWSTRING,
    self::STRING,
    self::TEXT,
    self::KEY,
    self::CONTENT,
    self::FILE,
    self::ARRAY,
    self::ARRAY_ARRAY,
    self::ITERABLE,
    self::RESOURCE,
  ];

  /**
   * @var string[] types PHP connus pour la génération d'autoproperties et
   * automethods
   */
  const PHP_KNOWN_TYPES = ["bool", "int", "float", "string", "array", "object", "iterable", "callable", "resource"];
}
