<?php
/**
 * PHP 断言验证
 * author: zhoutao
 * 用法: use Com\Assert
 * Assert::isArray('要验证的值', '报错码');
 * 报错码会直接调用E方法抛错
 */

namespace Com;

class Assert
{
    const MB_STRLEN_TYPE = 'utf-8';

    /**
     * 字符串长度 等于 $length
     * @param $data
     * @param $errorMsg
     * @param $length
     */
    static public function length($data, $errorMsg, $length)
    {
        if (mb_strlen($data, self::MB_STRLEN_TYPE) !== $length) {
            E($errorMsg);
        }
    }

    /**
     * 字符串长度在 $from < 长度 < $to 范围内
     * @param $data
     * @param $errorMsg
     * @param $from
     * @param $to
     */
    static public function lengthBetween($data, $errorMsg, $from, $to)
    {
        $length = mb_strlen($data, self::MB_STRLEN_TYPE);

        if ($length < $from || $length > $to) {
            E($errorMsg);
        }
    }

    /**
     * 字符串长度小于 $length
     * @param $data
     * @param $errorMsg
     * @param $length
     */
    static public function lengthLess($data, $errorMsg, $length)
    {
        if (mb_strlen($data, self::MB_STRLEN_TYPE) > $length) {
            E($errorMsg);
        }
    }

    /**
     * 字符串长度大于 $length
     * @param $data
     * @param $errorMsg
     * @param $length
     */
    static public function lengthGreater($data, $errorMsg, $length)
    {
        if (mb_strlen($data, self::MB_STRLEN_TYPE) < $length) {
            E($errorMsg);
        }
    }

    /**
     * 在数组内
     * @param $data
     * @param $errorMsg
     * @param array $range
     */
    static public function inArray($data, $errorMsg, array $range)
    {
        if (!in_array($data, $range, true)) {
            E($errorMsg);
        }
    }

    /**
     * 是数组
     * @param $data
     * @param $errorMsg
     */
    static public function isArray($data, $errorMsg)
    {
        if (!is_array($data)) {
            E($errorMsg);
        }
    }

    /**
     * 数组有键值 $key
     * @param $data
     * @param $errorMsg
     * @param $key
     */
    static public function hasKey($data, $errorMsg, $key)
    {
        if (!array_key_exists($key, $data)) {
            E($errorMsg);
        }
    }

    /**
     * 数组的count等于参数$count
     * @param $data
     * @param $errorMsg
     * @param $count
     */
    static public function count($data, $errorMsg, $count)
    {
        if (count($data) !== $count) {
            E($errorMsg);
        }
    }

    /**
     * 数组的count小于参数$count
     * @param $data
     * @param $errorMsg
     * @param $count
     */
    static public function countLess($data, $errorMsg, $count)
    {
        if (count($data) > $count) {
            E($errorMsg);
        }
    }

    /**
     * 数组的count大于参数$count
     * @param $data
     * @param $errorMsg
     * @param $count
     */
    static public function countGreater($data, $errorMsg, $count)
    {
        if (count($data) < $count) {
            E($errorMsg);
        }
    }

    /**
     * 值的范围在 $from <= value <= $to 范围内
     * @param $data
     * @param $errorMsg
     * @param $from
     * @param $to
     */
    static public function between($data, $errorMsg, $from, $to)
    {
        if ($data < $from || $data > $to) {
            E($errorMsg);
        }
    }

    /**
     * 值的范围在 $from < value < $to 范围内
     * @param $data
     * @param $errorMsg
     * @param $from
     * @param $to
     */
    static public function betweenStrict($data, $errorMsg, $from, $to)
    {
        if ($data <= $from || $data >= $to) {
            E($errorMsg);
        }
    }

    /**
     * 是布尔值
     * @param $data
     * @param $errorMsg
     */
    static public function bool($data, $errorMsg)
    {
        if (!is_bool($data)) {
            E($errorMsg);
        }
    }

    /**
     * 是 true
     * @param $bool
     * @param $errorMsg
     */
    static public function isTrue($bool, $errorMsg)
    {
        if ($bool === false) {
            E($errorMsg);
        }
    }

    /**
     * 是 false
     * @param $bool
     * @param $errorMsg
     */
    static public function isFalse($bool, $errorMsg)
    {
        if ($bool === true) {
            E($errorMsg);
        }
    }

    /**
     * 字符串是十进制数字
     * @param $data
     * @param $errorMsg
     */
    static public function digit($data, $errorMsg)
    {
        if (!ctype_digit($data)) {
            E($errorMsg);
        }
    }

    /**
     * 是空值
     * @param $data
     * @param $errorMsg
     */
    static public function isEmpty($data, $errorMsg)
    {
        if (!empty($data)) {
            E($errorMsg);
        }
    }

    /**
     * 不是空值
     * @param $data
     * @param $errorMsg
     */
    static public function notEmpty($data, $errorMsg)
    {
        if (empty($data)) {
            E($errorMsg);
        }
    }

    /**
     * 是float值
     * @param $data
     * @param $errorMsg
     */
    static public function float($data, $errorMsg)
    {
        if (!is_float($data)) {
            E($errorMsg);
        }
    }

    /**
     * 是int值
     * @param $data
     * @param $errorMsg
     */
    static public function int($data, $errorMsg)
    {
        if (!is_int($data)) {
            E($errorMsg);
        }
    }

    /**
     * 值小于等于 $number
     * @param $data
     * @param $errorMsg
     * @param $number
     */
    static public function less($data, $errorMsg, $number)
    {
        if ($data > $number) {
            E($errorMsg);
        }
    }

    /**
     * 值大于等于 $number
     * @param $data
     * @param $errorMsg
     * @param $number
     */
    static public function greater($data, $errorMsg, $number)
    {
        if ($data < $number) {
            E($errorMsg);
        }
    }

    /**
     * 值小于 $number
     * @param $data
     * @param $errorMsg
     * @param $number
     */
    static public function lessStrict($data, $errorMsg, $number)
    {
        if ($data >= $number) {
            E($errorMsg);
        }
    }

    /**
     * 值大于 $number
     * @param $data
     * @param $errorMsg
     * @param $number
     */
    static public function greaterStrict($data, $errorMsg, $number)
    {
        if ($data <= $number) {
            E($errorMsg);
        }
    }

    /**
     * 符合正则匹配
     * @param $data
     * @param $errorMsg
     * @param $pattern
     * @return $this
     */
    static public function match($data, $errorMsg, $pattern)
    {
        $checkResult = @preg_match($pattern, $data);

        if ($checkResult === 0) {
            E($errorMsg);
        }
    }

    /**
     * 值符合模式匹配
     * @param $data
     * @param $errorMsg
     * @param $pattern
     */
    static public function glob($data, $errorMsg, $pattern)
    {
        if (!fnmatch($pattern, $data)) {
            E($errorMsg);
        }
    }

    /**
     * 值小于 0
     * @param $data
     * @param $errorMsg
     */
    static public function negative($data, $errorMsg)
    {
        if ($data >= 0) {
            E($errorMsg);
        }
    }

    /**
     * 值大于 0
     * @param $data
     * @param $errorMsg
     */
    static public function positive($data, $errorMsg)
    {
        if ($data <= 0) {
            E($errorMsg);
        }
    }

    /**
     * 值和 $anotherValue 相同
     * @param $data
     * @param $errorMsg
     * @param $anotherValue
     */
    static public function isSame($data, $errorMsg, $anotherValue)
    {
        if ($data !== $anotherValue) {
            E($errorMsg);
        }
    }

    /**
     * 值和 $anotherValue 相同
     * @param $data
     * @param $errorMsg
     * @param $anotherValue
     */
    static public function notSame($data, $errorMsg, $anotherValue)
    {
        if ($data === $anotherValue) {
            E($errorMsg);
        }
    }

    /**
     * 值是 null
     * @param $data
     * @param $errorMsg
     */
    static public function isNull($data, $errorMsg)
    {
        if (!is_null($data)) {
            E($errorMsg);
        }
    }

    /**
     * 值不为 null
     * @param $data
     * @param $errorMsg
     */
    static public function notNull($data, $errorMsg)
    {
        if (is_null($data)) {
            E($errorMsg);
        }
    }

    /**
     * 值是数字 或 数字字符串
     * @param $data
     * @param $errorMsg
     */
    static public function numeric($data, $errorMsg)
    {
        if (!is_numeric($data)) {
            E($errorMsg);
        }
    }

    /**
     * 值是资源类型
     * @param $data
     * @param $errorMsg
     */
    static public function resource($data, $errorMsg)
    {
        if (!is_resource($data)) {
            E($errorMsg);
        }
    }

    /**
     * 值是字符串类型
     * @param $data
     * @param $errorMsg
     */
    static public function string($data, $errorMsg)
    {
        if (!is_string($data)) {
            E($errorMsg, $data);
        }
    }
}