<?php

namespace Application\Service\Extension\Helper;


use Application\Service\DB\Dictionary\FormField;

class ValidatorHelper
{
    public const PREG_IS_INTEGER = '/^[+-]?\d+$/';
    /**
     * 是否是字符串
     * @param $value
     * @return bool
     */
    public static function isString($value): bool
    {
        if (!is_numeric($value)) {
            return false;
        }

        return true;
    }

    /**
     * 是否是整数
     * @param $value
     * @param null $type
     * @return bool|string
     */
    public static function isInteger($value, $type = null)
    {
        if (self::isNotNumber($value)) {
            return '请填写正确的数字.';
        }

        if (!preg_match(self::PREG_IS_INTEGER, self::normalizeNumber($value))) {
            return '必须填写整数.';
        }

        return true;
    }

    private static function normalizeNumber($value)
    {
        $value = (string) $value;

        $localeInfo = localeconv();
        $decimalSeparator = $localeInfo['decimal_point'] ?? null;

        if ($decimalSeparator !== null && $decimalSeparator !== '.') {
            $value = str_replace($decimalSeparator, '.', $value);
        }

        return $value;
    }

    private static function isNotNumber($value): bool
    {
        return is_array($value)
            || is_bool($value)
            || (!is_object($value) && !is_scalar($value) && $value !== null);
    }

    /**
     * 是否是浮点数
     * @param $value
     * @param null $versionData
     * @return bool|string
     */
    public static function isFloat(&$value, $versionData = null)
    {
        $keep = 1;
        $type = $versionData['type'];
        if ($type == FormField::FORM_FIELD_TYPE_FLOAT_2) {
            $keep = 2;
        } elseif ($type == FormField::FORM_FIELD_TYPE_FLOAT_3) {
            $keep = 3;
        }
        $normalize = self::normalizeNumber($value);

        if (self::isNotNumber($value) || !is_numeric($normalize)) {
            return '请填写正确的数字.';
        }

        if (!preg_match("/^[-+]?[0-9]*\.?([0-9]){1,{$keep}}$/", $normalize)) {
            return "必须保留{$keep}位小数.";
        }

//        $value = sprintf("%01.{$keep}f", $value);
        return true;
    }

    public static function isBetween(&$value, $versionData = null)
    {
        $max = $versionData['max'] ?: '';
        $min = $versionData['min'] ?: '';

        if ($min !== '' && $value < $min) {
            return "不能小于{$min}.";
        }

        if ($min !== '' && $value > $max) {
            return "不能大于{$max}.";
        }

        return true;
    }

    public static function isLegalDate(&$value, $versionData = null)
    {
        // 对前端日期格式做兼容处理.
        if (stripos($value, '(中国标准时间)') !== false) {
            $value = str_replace('(中国标准时间)', '', $value);
        }

        $time = strtotime($value);

        if ($time === false) {
            return '请输入合法的日期';
        }

        if (strtotime($value) > time()) {
            if ($versionData['var_name'] === 'FUTDAT') {
                return true;
            }
            return '不能超过' . date('Y-m-d H:i:s');
        }

        // 年月日验证
        if ($versionData['type'] == FormField::FORM_FIELD_TYPE_DATE) {
            $dateString = $value;
            $format = 'Y-m-d'; // Y: 年, n: 月, d: 日, H: 时, i: 分, s: 秒

            $date = \DateTime::createFromFormat($format, $dateString);

            if ($date && $date->format($format) === $dateString) {
                return true;
            } else {
                return '日期格式不正确, 请重新选择日期';
            }
        }

        return true;
    }

    public static function isNumber($value): bool
    {
        $normalize = self::normalizeNumber($value);

        if (self::isNotNumber($value) || !is_numeric($normalize)) {
            return false;
        }

        return true;
    }
}
