<?php
/**
 * StrUtils.php UTF-8
 *
 *
 * @date    : 2018/4/23 10:41
 *
 * @license 这不是一个自由软件,未经授权不许任何使用和传播。
 * @author  : wuyonghong <wyh@huosdk.com>
 * @version : HUOSDK 8.0
 */

namespace huolib\tool;

use huolib\constant\WalletConst;

class StrUtils {
    /**
     * 去除所有空格
     *
     * @param $str
     *
     * @return mixed
     */
    public static function trimAll($str) {
        $_rule = array(" ", " ", "\t", "\n", "\r");
        $_replace = array("", "", "", "", "");

        return str_replace($_rule, $_replace, $str);
    }

    /**
     * 校验是否为合法手机号
     *
     * @param $phone
     *
     * @return false|int
     */
    public static function checkPhone($phone) {
        $_pattern = "/^1[23456789]\d{9}$/";

        return preg_match($_pattern, $phone);
    }

    /**
     * 校验是否为合法Email
     *
     * @param $email
     *
     * @return false|int
     */
    public static function checkEmail($email) {
        $_pattern = "/^([0-9A-Za-z\\-_\\.]+)@([0-9a-z]+\\.[a-z]{2,3}(\\.[a-z]{2})?)$/i";

        return preg_match($_pattern, $email);
    }

    /**
     * 校验是否是合法的英文与数字
     *
     * @param string $str
     *
     * @return false|int
     */
    public static function checkEnStrAndNum($str) {
        $_pattern = "/^[a-zA-Z0-9]+$/i";

        return preg_match($_pattern, $str);
    }

    /**
     * 校验是否是合法的可打印字符
     *
     * @param string $str
     *
     * @return false|int
     */
    public static function checkPrintStr($str) {
        $_pattern = "/^[A-Za-z0-9`~!@#$%^&*()_\-+=<>?:\"{}|,.\/;'\\[\]]+$/i";

        return preg_match($_pattern, $str);
    }

    /**
     * 手机中间四位加密
     *
     * @param string $phone
     * @param int    $start
     * @param int    $length
     *
     * @return null|string
     */
    public static function encryptPhone($phone = '', $start = 3, $length = 4) {
        if (empty($phone)) {
            return '';
        }
        if (false == self::checkPhone($phone)) {
            return false;
        }
        $replacement = str_pad('', $length, '*');

        return substr_replace($phone, $replacement, $start, $length);
        //return preg_replace('/(^.*)\d{4}(\d{4})$/', '\\1****\\2', $phone);
    }

    /**
     * 身份证号加密
     *
     * @param string $id_card 证件号
     * @param int    $start   开始长度
     * @param int    $end     结尾长度
     *
     * @return null|string
     */
    public static function encryptIdCard($id_card = '', $start = 3, $end = 2) {
        if (empty($id_card)) {
            return '';
        }
        $_length = strlen($id_card);
        $length = $_length - $end - $start;
        $replacement = str_pad('', $length, '*');

        return substr_replace($id_card, $replacement, $start, $length);
    }

    /**
     * 名字加密
     *
     * @param string $name 名字
     *
     * @return mixed
     */
    public static function encryptName($name) {
        if (empty($name)) {
            return '';
        }
        $encrypt_name = '';
        //判断是否包含中文字符
        if (preg_match("/[\x{4e00}-\x{9fa5}]+/u", $name)) {
            //按照中文字符计算长度
            $len = mb_strlen($name, 'UTF-8');
            //echo '中文';
            if ($len >= 3) {
                //三个字符或三个字符以上掐头取尾,中间用*代替
                $encrypt_name = mb_substr($name, 0, 1, 'UTF-8').str_repeat('*', $len - 2).mb_substr(
                        $name, -1, 1, 'UTF-8'
                    );
            } elseif ($len === 2) {
                //两个字符
                $encrypt_name = mb_substr($name, 0, 1, 'UTF-8').'*';
            }
        } else {
            //按照英文字串计算长度
            $len = strlen($name);
            //echo 'English';
            if ($len >= 3) {
                //三个字符或三个字符以上掐头取尾,中间用*代替
                $encrypt_name = substr($name, 0, 1).str_repeat('*', $len - 2).substr($name, -1);
            } elseif ($len === 2) {
                //两个字符
                $encrypt_name = substr($name, 0, 1).'*';
            }
        }

        return $encrypt_name;
    }

    /**
     * 邮箱加密
     *
     * @param string $email
     *
     * @return bool|string
     */
    public static function encryptEmail($email = '') {
        if (false == self::checkEmail($email)) {
            return false;
        }
        $_str = $email;
        $_email_array = explode("@", $_str);
        $_prev_fix = (strlen($_email_array[0]) < 4) ? "" : substr($_str, 0, 3); //邮箱前缀
        $_count = 0;
        $_str = preg_replace('/([\d\w+_-]{0,100})@/', '***@', $_str, -1, $_count);

        return $_prev_fix.$_str;
    }

    /**
     * 解析字符串
     *
     * @param string $str
     *
     * @return array
     */
    public static function parseStr($str = '') {
        $_str_arr = explode('&', $str);
        $_data_arr = array();
        foreach ($_str_arr as $_key => $_val) {
            $_pair = explode('=', $_val, 2);
            $_data_arr[$_pair[0]] = $_pair[1];
        }

        return $_data_arr;
    }

    /**
     * 获取随机字符串
     *
     * @param $length
     *
     * @return null|string
     */
    public static function getRandChars($length) {
        $str = null;
        $strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
        $max = strlen($strPol) - 1;
        for ($i = 0; $i < $length; $i++) {
            $str .= $strPol[rand(0, $max)];//rand($min,$max)生成介于min和max两个数之间的一个随机整数
        }

        return $str;
    }

    /**
     * 创建链接字符串
     *
     * @param array $para
     *
     * @return bool|string
     */
    public static function createLinkString(array $para) {
        $_arg = "";
        while (list($_key, $_val) = self::funcNewEach($para)) {
            $_arg .= $_key."=".urlencode($_val)."&";
        }
        // 去掉最后一个&字符
        $_arg = substr($_arg, 0, strlen($_arg) - 1);
        // 如果存在转义字符,那么去掉转义
        if (get_magic_quotes_gpc()) {
            $_arg = stripslashes($_arg);
        }

        return $_arg;
    }

    public static function funcNewEach(&$array) {
        $_res = array();
        $_key = key($array);
        if ($_key !== null) {
            next($array);
            $res[1] = $_res['value'] = $array[$_key];
            $res[0] = $_res['key'] = $_key;
        } else {
            $res = false;
        }

        return $res;
    }

    //生成订单号

    /**
     * 生成订单号
     *
     * @param int    $login_ch
     * @param int    $pay_ch
     * @param int    $mem_id
     *
     * @param string $ext
     *
     * @return string
     */
    public static function genOrderId(
        $login_ch = 0, $pay_ch = 0, $mem_id = 0, $ext = WalletConst::WALLET_ORDER_PREFIX_SDK
    ) {
        list($_u_sec, $_sec) = explode(" ", microtime());
        // 取微秒前3位+再两位随机数+玩家ID后四位+渠道ID后四位
        $_order_id = $ext.$_sec.
                     substr($_u_sec, 2, 3).
                     sprintf("%02d", $login_ch % 100).
                     sprintf("%02d", $pay_ch % 100).
                     sprintf("%02d", $mem_id % 100);

        return $_order_id;
    }

    /**
     *
     * @param $str
     *
     * @return string
     */
    public static function genToken($str = '') {
        $time = time();
        $pay_token = md5(md5(uniqid($str)).$time);

        return $pay_token;
    }

    /**
     * 参数排序
     *
     * @param array $para
     *
     * @return array
     */
    public static function argSort(array $para) {
        ksort($para);
        reset($para);

        return $para;
    }

    public static function sAddAlashes($string) {
        if (is_array($string)) {
            foreach ($string as $_key => $_val) {
                $string[$_key] = self::sAddAlashes($_val);
            }
        } else {
            $string = addslashes(trim($string));
        }

        return $string;
    }

    /**
     * 安全过滤
     *
     * @param $string
     *
     * @return array|string
     */
    public static function safeFilter($string) {
        $_magic_quote = get_magic_quotes_gpc();
        if (empty($_magic_quote)) {
            $string = self::sAddAlashes($string);
        }
        if (is_array($string)) {
            foreach ($string as $key => $val) {
                $string[$key] = self::sAddAlashes($val);
            }
        } else {
            $string = htmlspecialchars(trim($string));
        }

        return $string;
    }

    /**
     * 字符串转数组
     *
     * @param $string
     *
     * @return array
     */
    public static function strToArr($string) {
        return is_string($string) ? explode(',', $string) : $string;
    }

    /**
     * 数组转化为字符串
     *
     * @access public
     *
     * @param array $arr 数组
     *
     * @return string
     */
    public static function arrToStr($arr) {
        return is_array($arr) ? implode(',', $arr) : '';
    }

    /**
     * 获取正确的URL
     *
     * @param $url
     *
     * @return string
     */
    public static function getUrl($url) {
        //检查链接中是否存在 ?
        $_check = strpos($url, '?');
        //如果存在 ?
        if (false !== $_check) {
            if (substr($url, $_check + 1) == '') {
                //可以直接加上附加参数
                $_new_url = $url;
            } else {
                //如果有参数,如:http://www.yitu.org/index.php?ID=12
                $_new_url = $url.'&';
            }
        } else {//如果不存在 ?
            $_new_url = $url.'?';
        }

        return $_new_url;
    }

    /**
     * 格式化数字
     *
     * @param float $num
     *
     * @param int   $decimals 小数点后几位
     *
     * @return float
     */
    public static function formatNumber($num = 0.00, $decimals = 2) {
        return floatval(number_format($num, $decimals, '.', ''));
    }

    /**
     * 比较两个数字
     *
     * @param $num1
     * @param $num2
     *
     * @return int
     */
    public static function compareNumber($num1, $num2) {
        $_num1 = self::formatNumber($num1, 4);
        $_num2 = self::formatNumber($num2, 4);
        if ($_num1 == $_num2) {
            return 0;
        } elseif ($_num1 < $_num2) {
            return -1;
        } else {
            return 1;
        }
    }

    /**
     * ARPU(Average Revenue Per User) :平均每用户收入,即可通过 总收入/活跃用户 计算得出。
     *
     * @param float $sum_money
     * @param int   $user_cnt
     *
     * @return string
     */
    public static function getArpu($sum_money, $user_cnt) {
        $sum_money = (float)$sum_money;
        $user_cnt = (float)$user_cnt;
        if (!is_numeric($sum_money) || !is_numeric($user_cnt)) {
            return '0';
        }
        if (empty($user_cnt)) {
            return '0';
        }
        $_arppu = $sum_money / $user_cnt;

        return StrUtils::formatNumber($_arppu);
    }

    /**
     *
     * @param int $cnt1
     * @param int $cnt2
     *
     * @return string
     */
    public static function getRate($cnt1, $cnt2) {
        if (!is_numeric($cnt1)) {
            return '0%';
        }
        if (empty($cnt2) || $cnt2 == '0.00') {
            return '0%';
        }
        $_rate = 100 * $cnt1 / $cnt2;

        return StrUtils::formatNumber($_rate).'%';
    }

    public static function isJson($str) {
        json_decode($str);

        return (json_last_error() == JSON_ERROR_NONE);
    }

    /**
     * 根据当前url获取路由
     *
     * @param string $url 地址
     *
     * @return:string
     */
    public static function getRoute($url) {
        $_url_info = parse_url($url);
        /*url存在scheme则只获取链接路径*/
        if (isset($_url_info['scheme']) && isset($_url_info['path'])) {
            $_url = $_url_info['path'];
        } else {
            $_url = $url;
        }
        /*处理链接参数*/
        $_route_arr = array_slice(explode('/', $_url), 0, 4);
        $_route = implode('/', $_route_arr);

        return $_route;
    }
}