<?php
namespace nur\sery\wip\schema\types;

use nur\sery\wip\schema\_scalar\ScalarResult;
use nur\sery\wip\schema\_scalar\ScalarSchema;
use nur\sery\wip\schema\Result;
use nur\sery\wip\schema\Schema;

class tint extends _tsimple {
  static function ensure_int(&$int): void {
    if (!is_int($int)) $int = intval($int);
  }

  static function ensure_nint(&$int): void {
    if ($int !== null) self::ensure_int($int);
  }

  const INT_PATTERN = '/^[-+]?[0-9]+(?:\.[0-9]*)?$/';

  function isValid($value, ?bool &$normalized=null): bool {
    $normalized = is_int($value);
    if (is_string($value)) $valid = is_numeric(trim($value));
    else $valid = is_scalar($value);
    return $valid;
  }

  /**
   * @var ScalarResult $result
   * @var ScalarSchema $schema
   */
  function verifix(&$value, Result &$result, Schema $schema): bool {
    if (is_int($value)) {
      $result->setNormalized();
      return false;
    } elseif (is_string($value)) {
      $int = trim($value);
      if (is_numeric($int)) $value = intval($int);
      else return $result->setInvalid($value, $schema);
    } elseif (is_scalar($value)) {
      $value = intval($value);
    } else {
      return $result->setInvalid($value, $schema);
    }
    $result->setValid();
    return true;
  }

  function format($value, $format=null): string {
    if ($format !== null) return sprintf($format, $value);
    else return strval($value);
  }
}
