<?php

use App\Facades\UploadService;
use App\Models\NewFatLog;
use App\Models\User;
use Illuminate\Support\Facades\Redis;
use SimpleSoftwareIO\QrCode\Facades\QrCode;

/**
 * 获取ip
 */
if(!function_exists('get_real_ip')){
    function get_real_ip()
    {
        $ip=false;
        if(!empty($_SERVER["HTTP_CLIENT_IP"])){
            $ip = $_SERVER["HTTP_CLIENT_IP"];
        }
        if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
            $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
        }
        return($ip ? $ip : $_SERVER['REMOTE_ADDR']);
    }
}
/**
 * http get请求
 */
if(!function_exists('http_get_request')){
    //HTTP请求（支持HTTP/HTTPS，支持GET/POST）
    function http_get_request($url, $data = null,$headers=[])
    {
        try{
            $curl = curl_init();
            curl_setopt($curl, CURLOPT_URL, $url);
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
            if (!empty($data)) {
                curl_setopt($curl, CURLOPT_POST, TRUE);
                curl_setopt($curl, CURLOPT_POSTFIELDS,$data);
            }
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);

            // 设置自定义Header参数
            if (!empty($headers)) {
                curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
            }
            $output = curl_exec($curl);
            curl_close($curl);
            return json_decode($output,true);
        }catch(\Exception $e){
            // HandleLogs::error('HTTP请求 异常','微信内容安全',$e);
            return '';
        }
    }
}
/**
 * 获取日期和第二天时间间隔
 */
if(!function_exists('get_day_time')){
    function get_day_time($date){
        if(empty($date)){
            $date = date('Y-m-d');
        }
        // 获取今天零点的时间戳
        $today_start = strtotime($date);
        // 获取明天零点的时间戳
        $tomorrow_start = $today_start + 86400;
        // 格式化时间戳为日期时间字符串
        $start_time = date('Y-m-d H:i:s', $today_start);
        $end_time = date('Y-m-d H:i:s', $tomorrow_start);
        return [$start_time,$end_time];
    }
}
/**
 * 获取用户单位
 */
if(!function_exists('get_user_unit')){
    function get_user_unit($language,$unit){
        if(in_array($language,[User::LANGUAGE_CH,User::LANGUAGE_TW]) && $unit == 'lb'){
            $unit = '斤';
        }
        if($language == User::LANGUAGE_EN && $unit == '斤'){
            $unit = 'lb';
        }
        return $unit;
    }
}
if(!function_exists('change_unit')){
    function change_unit($language,$user_unit){
        if(in_array($language,[User::LANGUAGE_CH,User::LANGUAGE_TW]) && $user_unit == 'lb'){
            $user_unit = '斤';
        }
        if($language == User::LANGUAGE_EN){
            $user_unit = 'lb';
        }
        return $user_unit;
    }
}
/**
 * 随机生成16位数退款订单号
 * @return string  退款订单号
 */
if(!function_exists('get_refund_trade_no')) {
    function get_refund_trade_no()
    {
        $dateline = time();
        $mix_1 = rand(100, 999);
        $mix_2 = rand(10, 99);
        return 'r' . $dateline . $mix_1 . $mix_2;
    }
}
/**
 * 直接获取小数位
 */
if(!function_exists('get_two_float')) {
    function get_two_float($number,$precision)
    {
        $number = (float)$number;
        return  (round($number * pow(10, $precision))) / pow(10, $precision);
    }
}
/**
 * 拼接get请求参数
 */
if(!function_exists('get_request_url_param')) {
    function get_request_url_param($url, $params)
    {
        // 拼接参数到 URL
        $query = http_build_query($params);
        $url = $url . '?' . $query;
        return $url;
    }
}
/**
 * 处理电话号码中间四位
 */
if(!function_exists('masked_phone')) {
    function masked_phone($phone)
    {
        return substr($phone, 0, 3) . str_repeat("*", 4) . substr($phone, 7);
    }
}

/**
 * 生成网易云信ac cid
 */
if(!function_exists('make_wangyiyun_accid')) {
    function make_wangyiyun_accid($id)
    {
        return config('app.env')."_".$id;
    }
}

/**
 * 网易云信accid 返回用户id
 */
if (!function_exists('get_userid_by_accid')){
    function get_userid_by_accid($accid)
    {
        return str_replace(config('app.env')."_","",$accid);
    }
}
/**
 * 手机号码验证
 */
if (!function_exists('match_mobile')){
    function match_phone($mobile)
    {
        return preg_match("/^(\+?0?86-?)?[1-9]\d{10}$/", $mobile);
    }
}

/**
 * 获取阿里云配置
 */
if (!function_exists('gmt_iso8601')){
    function gmt_iso8601($time)
    {
        $dt_str = date("c", $time);
        $date_time = new \DateTime($dt_str);
        $expiration = $date_time->format(\DateTime::ISO8601);
        $pos = strpos($expiration, '+');
        $expiration = substr($expiration, 0, $pos);
        return $expiration . "Z";
    }
}

/**
 * 处理单位
 */
if (!function_exists('change_user_unit')){
    function change_user_unit($log,$unit,$language,$fat_device=User::FAT_DEVICE_YUNKANGBAO)
    {
        $res_fat_data = $log['fat_data'];
        $res_unit = $log['unit'];
        if ($log['unit'] == 'kg' && $unit == '斤' && in_array($language,[User::LANGUAGE_CH,User::LANGUAGE_TW])) {
            $res_fat_data = get_two_float($log['fat_data'] * NewFatLog::WEIGHT_JIN_KG_RATE, 2);
            $res_unit = '斤';
        }
        if ($log['unit'] == 'kg' && $unit == '斤' && $language == User::LANGUAGE_EN) {
//            $res_fat_data = get_two_float($log['fat_data'] * NewFatLog::WEIGHT_RATE, 2);
            $res_fat_data = get_two_float(get_unit_rate($log['fat_data'],$fat_device), 1);
            $res_unit = 'lb';
        }
        if($log['unit'] == 'kg' && $unit == 'lb' && $language == User::LANGUAGE_EN){
//            $res_fat_data = get_two_float($log['fat_data'] * NewFatLog::WEIGHT_RATE, 2);
            $res_fat_data = get_two_float(get_unit_rate($log['fat_data'],$fat_device), 1);
            $res_unit = 'lb';
        }
        if($log['unit'] == 'kg' && $unit == 'lb' && in_array($language,[User::LANGUAGE_CH,User::LANGUAGE_TW])){
            $res_fat_data = get_two_float($log['fat_data'] * NewFatLog::WEIGHT_JIN_KG_RATE, 2);
            $res_unit = '斤';
        }
        if($log['unit'] == 'lb' && $unit == 'kg' ){
//            $res_fat_data = get_two_float($log['fat_data'] / NewFatLog::WEIGHT_RATE, 2);
            $res_fat_data = get_two_float(($log['fat_data'] / get_unit_rate($log['fat_data'],$fat_device)), 2);
            $res_unit = 'kg';
        }
        if($log['unit'] == 'lb' && $unit == '斤' ){
//            $res_fat_data = get_two_float($log['fat_data'] / NewFatLog::WEIGHT_JIN_LB_RATE, 2);
            $res_fat_data = get_two_float(($log['fat_data'] / (get_unit_rate($log['fat_data'],$fat_device)))/2, 2);
            $res_unit = '斤';
        }
        $log['fat_data'] = $res_fat_data;
        $log['unit'] = $res_unit;
        return $log;
    }
}

if (!function_exists('get_unit_rate')){
    function get_unit_rate($weight,$fat_device=User::FAT_DEVICE_YUNKANGBAO)
    {
        $rate = 1;
        if(empty($weight)){
            return $rate;
        }
        $rate = (((($weight * 100 * 11023 + 50000) / 100000) << 1) / 10);
        if($fat_device == 0){
            $rate = $weight*NewFatLog::WEIGHT_RATE;
        }
        return $rate;
    }
}

/**
 * 处理boundaries
 */
if (!function_exists('change_boundaries')){
    function change_boundaries($boundaries,$unit,$language)
    {
        $rate = 1;
        if($unit == 'kg'){
            return $boundaries;
        }
        if ($unit == '斤' && $language == 0) {
            $rate = NewFatLog::WEIGHT_JIN_KG_RATE;
        }
        if ($unit == '斤' && $language == 1) {
            $rate = NewFatLog::WEIGHT_RATE;
        }
        if($unit == 'lb' && $language == 1){
            $rate = NewFatLog::WEIGHT_RATE;
        }
        if($unit == 'lb' && $language == 0){
            $rate = NewFatLog::WEIGHT_JIN_KG_RATE;
        }
        foreach ($boundaries as $key =>$value){
            $boundaries[$key] = get_two_float($value * $rate, 2);
        }
        return $boundaries;
    }
}

/**
 * 服务层返回错误
 */
if (!function_exists('service_fail')){
    function service_fail($msg)
    {
        return ['status'=>false,'msg'=>$msg];
    }
}

/**
 * 服务层返回数据
 */
if (!function_exists('service_success')){
    function service_success($data=[])
    {
        return ['status'=>true,'data'=>$data];
    }
}
/**
 * 获取异常信息数据统一处理
 */
if (!function_exists('get_error_msg')){
    function get_error_msg($e)
    {
        $file = "file:".$e->getFile()."\r\n";
        $line = "line:".$e->getLine()."\r\n";
        $message  = "message:".$e->getMessage()."\r\n";
        $msg = $file.$line.$message;
        return $msg;
    }
}

//随机返回数组里面的n条数据
if (!function_exists('get_random_elements')) {
    function get_random_elements(array $array, int $count): array
    {
        $keys = array_rand($array, min($count, count($array)));
        if (!is_array($keys)) {
            $keys = [$keys];
        }
        return array_intersect_key($array, array_flip($keys));
    }
}

/**
 * 获取步幅
 * 步幅(m)=(身高(cm)*0.413)/100
 */
if (!function_exists('get_stride_by_height')) {
    function get_stride_by_height($height)
    {
        if (!$height) {
            return 0;
        }
        return number_format($height * 0.413 / 100, 2);
    }
}

/**
 * 获取距离
 * 距离(km)=步数*步幅(meters)/1000
 */
if (!function_exists('get_km_by_step')) {
    function get_km_by_step($step, $height)
    {
        $stride = get_stride_by_height($height);
        return number_format($step * $stride / 1000, 2);
    }
}

/**
 * 获取卡路里
 * 卡路里=步数*步幅(米)*体重(千克)/步数每千米(1240)
 */
if (!function_exists('get_cal_by_step')) {
    function get_cal_by_step($step, $height, $weight)
    {
        $stride = get_stride_by_height($height);
        return number_format($step * $stride * $weight / 1240, 2);
    }
}
/**
 * 获取二维码
 */
if (!function_exists('get_qrcode')) {
    function get_qrcode($key_name,$url,$id)
    {
        $redis = Redis::client();
        $qrcode = $redis->get($key_name.'_'.$id);
        $pic = '';
        if($qrcode){
            $pic = $qrcode;
        }else{
            $path = storage_path('qrcode/' . $id . '_activity.svg');
            QrCode::generate($url, $path);

            if (file_exists($path)) {
                $pic = UploadService::uploadFile($path);
                $redis->set($key_name.'_'.$id,$pic);
                @unlink($path);
            }
        }
        return $pic;
    }
}
/**
 * 生成友福id
 */
if (!function_exists('make_user_id')) {
    function make_user_id($uid){
        return 5233000000 + $uid;
    }
}

if (!function_exists('downloadVideoToLocal')) {
    function downloadVideoToLocal($videoUrl, $localFilePath)
    {
        $videoContent = file_get_contents($videoUrl);
        file_put_contents($localFilePath, $videoContent);
    }
}

if (!function_exists('getVideoDuration')) {
    function getVideoDuration($filePath)
    {
        $command = "ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 $filePath";
        $duration = shell_exec($command);

        return intval(round(floatval($duration)));
    }
}
/**
 * 获取当天还剩多少s
 */
if (!function_exists('getDayExpire')) {
    function getDayExpire()
    {
        // 获取当前时间戳
        $currentTimestamp = time();
        // 获取当天结束的时间戳
        $endOfDayTimestamp = strtotime('tomorrow') - 1;
        // 计算距离当天结束还有多少秒过去
        $secondsUntilEndOfDay = $endOfDayTimestamp - $currentTimestamp;
        return $secondsUntilEndOfDay;
    }
}

/**
 * 加密
 */
if (!function_exists("aesEncryptCBC")) {
    function aesEncryptCBC($data){
        $key = env("ENCRYPT_KEY");
        $iv = env("ENCRYPT_IV");
        $encrypted = openssl_encrypt($data, "AES-128-CBC", $key, OPENSSL_PKCS1_PADDING, $iv);
        //增加前缀 ufutx_
        $prefix = "Ec!AEC$:";
        return $prefix . base64_encode($encrypted);
    }
}

/**
 * 解密
 */
if (!function_exists("aesDecryptCBC")) {
    function aesDecryptCBC($data){
        $prefix = "Ec!AEC$:";
        $substring = substr($data, 0, 8);
        if ($substring == $prefix) {
            $data = substr($data, 8, -1);
        }
        $key = env("ENCRYPT_KEY");
        $iv = env("ENCRYPT_IV");
        $decrypted = openssl_decrypt(base64_decode($data), "AES-128-CBC", $key, OPENSSL_PKCS1_PADDING, $iv);
        return $decrypted;
    }
}