<?php

namespace EesyPHP;

class Check {
  public static function name($name) {
    if (preg_match('/^[\w \-]{2,}$/iu',$name))
      return true;
    return false;
  }

  public static function id(&$id) {
    if (is_int($id))
      return true;
    if (preg_match('/^[0-9]+$/', $id)) {
      $id = intval($id);
      return true;
    }
    return false;
  }

  public static function search_pattern($pattern) {
    foreach(preg_split('/\s+/', trim($pattern)) as $word) {
      if (!self :: id($word) && !self :: name($word))
        return false;
    }
    return true;
  }

  public static function time(&$time) {
    if (!is_int($time)) {
      if (preg_match('/^[0-9]+$/', $time))
        $time = intval($time);
      else
        return false;
    }
    return ($time >= 1577833200);  // 2020-01-01 - date of birth of this soft
  }

  public static function description($comment) {
    if (preg_match("/^[\p{L}0-9\p{P}\p{Zs}\p{Zl}\p{Sc}\=\+]+$/uim", $comment))
      return true;
    return false;
  }

  public static function email($value, $domain=NULL, $checkDns=true) {
    $regex = '/^((\"[^\"\f\n\r\t\v\b]+\")|([\w\!\#\$\%\&\'\*\+\-\~\/\^\`\|\{\}]+(\.[\w\!\#\$\%\&\'\*\+\-\~\/\^\`\|\{\}]+)*))@((\[(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))\])|(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))|((([A-Za-z0-9\-])+\.)+[A-Za-z\-]+))$/';

    if (!preg_match($regex, $value)) {
      return false;
    }

    $nd = explode('@', $value);
    $nd=$nd[1];

    if ($domain) {
      if(is_array($domain)) {
        if (!in_array($nd,$domain)) {
          return false;
        }
      }
      else {
        if($nd!=$domain) {
          return false;
        }
      }
    }

    if ($checkDns && function_exists('checkdnsrr')) {
      if (!(checkdnsrr($nd, 'MX') || checkdnsrr($nd, 'A'))) {
        return false;
      }
    }

    return true;
  }

  public static function ip_address($ip, $allow_private_ip_address=true, $allow_reserved_ip_address=true,
                      $ipv4_only=false, $ipv6_only=false) {
  	$flag = null;
  	if ($ipv4_only)
  		$flag |= FILTER_FLAG_IPV4;

  	if ($ipv6_only)
  		$flag |= FILTER_FLAG_IPV6;

  	if (!isset($allow_private_ip_address) || !$allow_private_ip_address)
  		$flag |= FILTER_FLAG_NO_PRIV_RANGE;

  	if (!isset($allow_reserved_ip_address) || !$allow_reserved_ip_address)
  		$flag |= FILTER_FLAG_NO_RES_RANGE;

  	if (!is_null($flag))
  		return (bool)filter_var($ip, FILTER_VALIDATE_IP, $flag);
  	else
  		return (bool)filter_var($ip, FILTER_VALIDATE_IP);
  }

  public static function tcp_or_udp_port($value) {
    if (!is_int($value)) {
      if (!preg_match('/^[0-9]+$/', $value))
        return false;
      $value = intval($value);
    }
    if ($value <= 0) return false;
    if ($value > 65635) return false;
    return true;
  }

  public static function is_empty($val) {
    switch(gettype($val)) {
      case "boolean":
      case "integer":
      case "double":
      case "object":
      case "resource":
        return False;
      case "array":
      case "string":
        if ($val == "0") return false;
        return empty($val);
      case "NULL":
        return True;
    }
  }

}

# vim: tabstop=2 shiftwidth=2 softtabstop=2 expandtab
