<?php

if (! function_exists('fen_2_yuan')) {
    /**
     * 分转换成元
     *
     * @param  string  $fen
     * @return string
     */
    function fen_2_yuan($fen)
    {
        return $fen ? bcdiv($fen, '100', 2) : '0';
    }
}

if (! function_exists('yuan_2_fen')) {
    /**
     * 元转换成分
     *
     * @param  string  $yuan
     * @return int
     */
    function yuan_2_fen($yuan)
    {
        $yuan = money_format($yuan); // 首先移除可能存在的千分位逗号

        return intval(bcmul($yuan, '100'));
    }
}

if (! function_exists('money_format')) {
    /**
     * 去除金额千分位逗号
     *
     * @param  string  $yuan
     * @return string
     */
    function money_format($yuan)
    {
        return $yuan ? str_replace(',', '', $yuan) : $yuan;
    }
}

if (! function_exists('object_2_array')) {
    // 对象转换成数组
    function object_2_array($object)
    {
        return array_map('get_object_vars', $object);
    }
}
if (! function_exists('byte_2_human')) {
    // 换算成人可读文件大小
    function byte_2_human($byte) //传入字节单位
    {
        $KB = 1024;
        $MB = $KB * 1024;
        $GB = $MB * 1024;
        $TB = $GB * 1024;
        if ($byte < $KB) {
            return $byte.'B';
        } elseif ($byte < $MB) {
            //取两位小数四舍五入
            return round($byte / $KB, 2).'KB';
        } elseif ($byte < $GB) {
            return round($byte / $MB, 2).'MB';
        } elseif ($byte < $TB) {
            return round($byte / $GB, 2).'GB';
        } else {
            return round($byte / $TB, 2).'TB';
        }
    }
}
if (! function_exists('clean_ids')) {
    /**
     * 清理输入字符串，提取数字ID，并返回一个整数数组或以逗号分隔的字符串。
     *
     * @param  string  $idsString  原始输入字符串，包含多个ID和不同的分隔符
     * @param  bool  $returnArray  是否返回数组，默认为 false，返回字符串
     * @return array|string 返回整数ID数组或以逗号分隔的ID字符串
     */
    function clean_ids($idsString, $returnArray = false)
    {
        // 替换所有非数字字符为英文逗号
        $ids = preg_replace('/[\D]+/', ',', trim($idsString));

        // 移除字符串开头和结尾的逗号
        $ids = trim($ids, ',');

        if (! $returnArray) {
            // 返回处理后的字符串
            return $ids;
        }

        // 分割字符串为数组，并过滤掉空字符串
        $idArr = array_filter(explode(',', $ids), 'strlen');

        // 将数组的每个元素转换为整数并去重
        $idArr = array_unique($idArr);

        return $idArr;
    }
}
if (! function_exists('is_sequential')) {
    function is_sequential($array)
    {
        $minCount = min($array);
        $maxCount = max($array);

        if ($minCount != 1 || $maxCount != count($array)) {
            return false;
        }

        $expectedCounts = range(1, count($array));

        if (array_values($array) != $expectedCounts) {
            return false;
        }

        return true;
    }
}
if (! function_exists('getAgeByIdCard')) {
    function getAgeByIdCard($idCard)
    {
        // 验证身份证号码的长度
        if (strlen($idCard) != 18) {
            return ''; // 未知
        }

        // 提取出生日期
        $birthDate = substr($idCard, 6, 8); // 身份证的第7到第14位为出生日期
        $year = (int) substr($birthDate, 0, 4);
        $month = (int) substr($birthDate, 4, 2);
        $day = (int) substr($birthDate, 6, 2);

        // 获取当前日期
        $currentDate = new DateTime();
        $birthDateTime = new DateTime("$year-$month-$day");

        // 计算年龄
        $age = $currentDate->diff($birthDateTime)->y;

        return $age;
    }
}

if (! function_exists('getSexByIdCard')) {
    /**
     * 根据身份证获取性别
     *
     * @param  string  $idCard  身份正号
     * @return int 1=男, 2=女
     */
    function getSexByIdCard($idCard)
    {
        // 验证身份证号码的长度
        if (strlen($idCard) != 18) {
            return 0; // 未知
        }

        // 提取性别位（第17位）
        $gender = (int) substr($idCard, 16, 1); // 第17位的性别数字

        // 判断性别
        if ($gender % 2 == 0) {
            return 2; // 偶数女
        } else {
            return 1; // 基数男
        }
    }
}

if (! function_exists('data_masking')) {
    /**
     * 数据脱敏.
     *
     * @param  string  $strType  脱敏类型，姓名、生日、手机号……
     * @param  string  $str  被脱敏文本
     * @return string 脱敏后文本
     */
    function data_masking(string $strType, $str = '')
    {
        if (! isset($str) || (! trim($str) && trim($str) == '')) {
            return $str;
        }
        switch ($strType) {
            case 'uname': // 如果是字符和就显示前后各一位，如果是手机号则展示前3位和后4位
                if (preg_match('/^1[3456789]{1}[0-9]{9}$/', $str)) {
                    $maskStr = substr_replace($str, '****', 3, 4);
                } else {
                    //普通账号不做脱敏展示
                    $maskStr = $str;
                    //$maskStr = str_repeat("*", mb_strlen($str)-1) . mb_substr($str, -1, 1);
                }
                break;
            case 'truename': // 只隐藏第一位，浙里办
                $maskStr = '*'.mb_substr($str, 1);
                break;
            case 'truename2': // 只隐藏第二位，其他
                $len = mb_strlen($str);
                if ($len == 2) {
                    $maskStr = mb_substr($str, 0, 1).'*';
                }
                if ($len < 2) {
                    $maskStr = $str;
                }
                if ($len > 2) {
                    $maskStr = mb_substr($str, 0, 1).str_repeat('*', mb_strlen($str) - 2).mb_substr($str, -1, 1);
                }
                break;
            case 'birthday': // 仅展示最后一位
                $maskStr = '****-**-*'.substr($str, -1, 1);
                break;
            case 'bankcard': // 展示前4位和后3位
                $maskStr = substr($str, 0, 4).'************'.substr($str, -4, 3);
                break;
            case 'idcard': // 只展示第一位和最后一位
                $maskStr = substr($str, 0, 1).str_repeat('*', strlen($str) - 2).substr($str, -1, 1);
                break;
            case 'mobile': // 展示前3位和后4位
                $maskStr = substr_replace($str, '****', 3, 4);
                break;
            case 'email': // 名字部分只展示首位和末位
                $pos = stripos($str, '@', 0);
                $maskStr = substr($str, 0, 1).str_repeat('*', $pos - 2).substr($str, $pos - 1, 1).substr($str, $pos);
                break;
            case 'address': // 地址的详细地址部分
                $maskStr = '******';
                break;
            case 'detailedaddress':// 详细地址，只展示前6位
                $maskStr = mb_substr($str, 0, 6).'******';
                break;
            case 'image':
                $maskStr = env('DEFAULT_PIC');
                break;
            case 'sex':
                $maskStr = '*';
                break;
            default:
                $maskStr = $str;
                break;
        }

        return $maskStr;
    }
}
