<?php
/**
 * API入参静态检查类
 * 可以对API的参数类型、长度、最大值、最小值、值是否在数组内、数据值是否为空等进行校验
 *
 * @author jerry(14033184@cnsuning.com)
 * @date   2014-05-26
 */
class RequestCheckUtil
{
	/**
	 * 校验字段fieldName的值$value非空
	 */
	public static function checkNotNull($value, $fieldName)
    {
		if (self::checkEmpty($value)) {
			throw new Exception("client-check-error:Missing Required Arguments:{$fieldName}", 40);
		}
	}

	/**
	 * 校验数组fieldName的值非空
	 */
	public static function checkNotNullInItemList($ItemList, $fieldName)
    {
        if (!is_array($ItemList) || empty($ItemList)) {
            return ;
        }

        foreach ($ItemList as $v) {
            if (self::checkEmpty($v)) {
                throw new Exception("client-check-error:Missing Required Arguments:{$fieldName}.", 40);
            }
        }
	}

	/**
	 * 检验字段fieldName的值value的长度
	 */
	public static function checkMaxLength($value, $maxLength, $fieldName)
    {
		if (!self::checkEmpty($value) && mb_strlen($value , "UTF-8") > $maxLength) {
			throw new Exception("client-check-error:Invalid Arguments:{$fieldName}.", 41);
		}
	}

	/**
	 * 检验字段fieldName的值value的最大列表长度
	 */
	public static function checkMaxListSize($value, $maxSize, $fieldName)
    {

		if (self::checkEmpty($value)) {
			return ;
        }

		$list = preg_split("/,/",$value);
		if (count($list) > $maxSize) {
            throw new Exception("client-check-error:Invalid Arguments:{$fieldName}.", 41);
		}
	}

	/**
	 * 检验字段fieldName的值value 的最大值
	 */
	public static function checkMaxValue($value, $maxValue, $fieldName)
    {

		if (self::checkEmpty($value)) {
			return ;
        }

		self::checkNumeric($value,$fieldName);

		if ($value > $maxValue) {
            throw new Exception("client-check-error:Invalid Arguments:{$fieldName}.", 41);
		}
	}

	/**
	 * 检验字段fieldName的值value 的最小值
	 */
	public static function checkMinValue($value, $minValue, $fieldName)
    {

		if (self::checkEmpty($value)) {
			return ;
        }

		self::checkNumeric($value,$fieldName);

		if ($value < $minValue) {
            throw new Exception("client-check-error:Invalid Arguments:{$fieldName}." , 41);
		}
	}

	/**
	 * 检验字段fieldName的值value 的值是否手机号
	 */
    public static function checkPhoneValue($value, $fieldName)
    {
		if (!preg_match("/1[3458]{1}\d{9}$/", $value)) {
            throw new Exception("client-check-error:Invalid Arguments:{$fieldName}." , 41);
		}
    }

	/**
	 * 检验字段fieldName的值value 的值是否在itemList中
	 */
	public static function checkValueInItemList($value, $itemList, $fieldName)
    {

		if (self::checkEmpty($value)) {
			return ;
        }

		if (!in_array($value, $itemList)) {
            throw new Exception("client-check-error:Invalid Arguments:{$fieldName}." , 41);
		}
	}

	/**
	 * 检验字段fieldName的值value是否是number
	 */
	public static function checkNumeric($value, $fieldName)
    {
		if (!is_numeric($value)) {
			throw new Exception("client-check-error:Invalid Arguments:{$fieldName}.", 41);
        }
	}

	/**
	 * 检验字段fieldName的值value是否是金额类型的值(默认保留小数点后2位)
	 */
	public static function checkFormatNumber($value, $fieldName, $len = 2)
    {
		if (!preg_match('/^\d+\.\d{'.$len.'}$/', $value)) {
			throw new Exception("client-check-error:Invalid Arguments:{$fieldName}.", 41);
        }
	}

	/**
	 * 检验字段fieldName的值value日期格式(默认$type=1即YYYY-MM-DD)
	 */
	public static function checkDateValue($value, $fieldName, $type = 1, $compare = true)
    {
        if ($type == 1) {
            $pattern  = '/^(\d{4})-(\d{2})-(\d{2})$/';
            $currDate = date('Y-m-d');
        } else if ($type == 2) {
            $pattern  = '/^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/';
            $currDate = date('Y-m-d H:i:s');
        }
        
        $result = preg_match($pattern, $value) ? true : false;
        return $result;
	}

	/**
	 * 检验图片格式
	 */
	public static function checkPicExt($type, $ext = array('jpg', 'gif', 'bmp', 'jpeg'))
    {
        if (!in_array($type, $ext)) {
			throw new Exception("client-check-error:Invalid Picture extension.", 41);
        }
	}

	/**
	 * 检验字段fieldName的值value是否是邮编
	 */
	public static function checkZipValue($value, $fieldName)
    {
        if (!preg_match('/^\d{6}$/', $value) ) {
			throw new Exception("client-check-error:Invalid Arguments:{$fieldName}.", 41);
        }
	}

	/**
	 * 校验value是否非空
	 *  if not set ,return true;
	 *	if is null , return true;
	 */
	public static function checkEmpty($value)
    {
		if (!isset($value)) {
			return true ;
        }
		if ($value === null ) {
			return true;
        }
		if (trim($value) === "") {
			return true;
        }
		return false;
	}

	/**
	 * 校验是否为正整数
	 * @param unknown $value
	 * @param unknown $fieldName
	 * @throws Exception
	 */
	public static function checkPositiveInteger($value,$fieldName){
		if (self::checkEmpty($value)) {
			throw new Exception("client-check-error:Invalid Arguments:{$fieldName}.", 40);
		}
		if(!preg_match('/^-?\d+$/',$value) && $value > 0){
			throw new Exception("client-check-error:Invalid Arguments:{$fieldName}.", 41);
		}
	}

	/**
	 * 开始结束日期校验
	 * @param unknown $start
	 * @param unknown $end
	 * @throws Exception
	 */
	public static function checkDateCompare($start,$end){
		if(strtotime($end) < strtotime($start)){
			throw new Exception("client-check-error:Invalid Arguments:date compare .", 41);
		}
	}

	/**
	 * 开始结束日期差是否超出限制,天为单位
	 * @param unknown $start
	 * @param unknown $end
	 * @throws Exception
	 */
	public static function checkDateT($start,$end,$maxDate){
		$date=strtotime($end)-strtotime($start);
		$max = 86400 * $maxDate;
		if($date > $max){
			throw new Exception("client-check-error:Invalid Arguments:DateT .", 41);
		}
	}

	/**
	 * 检查日期格式 yyyy-MM-dd HH:mm:ss
	 * @param unknown $value
	 * @param unknown $fieldName
	 * @throws Exception
	 */
	public static function checkDate($value,$fieldName){
		$pattern = '/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/s';
		if(!preg_match($pattern,$value) || !strtotime($value)){
			throw new Exception("client-check-error:Invalid Arguments:{$fieldName} .", 41);
		}
	}
	
	/**
	 * 判断数组中的数组必有一个不为空
	 * @param unknown $array
	 * @throws Exception
	 */
	public static function checkArrayAllNull($array){
		if (!is_array($array) || empty($array)) {
			throw new Exception("client-check-error:Invalid Arguments:All null .", 41);
		}
		$b = false;
		foreach ($array as $v) {
			if(is_array($v) && !empty($v)){
				$b = true;
				break;
			}
		}
		if(!$b){
			throw new Exception("client-check-error:Invalid Arguments:All null .", 41);
		}
	}
}
?>