<?php
/**
 * Created by PhpStorm.
 * User: pijh
 * Date: 2017/8/20
 * Time: 00:33
 */


use Illuminate\Support\Arr;
use \Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;

if (! function_exists('user_admin_config')) {
    function user_admin_config($key = null, $value = null)
    {
        $session = session();

        if (! $config = $session->get('admin.config')) {
            $config = config('admin');

            $config['lang'] = config('app.locale');
        }

        if (is_array($key)) {
            // 保存
            foreach ($key as $k => $v) {
                Arr::set($config, $k, $v);
            }

            $session->put('admin.config', $config);

            return;
        }

        if ($key === null) {
            return $config;
        }

        return Arr::get($config, $key, $value);
    }
}

//生成随机码
function create_invite_code() {
    $code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $rand = $code[rand(0,25)]
        .strtoupper(dechex(date('m')))
        .date('d')
        .substr(time(),-5)
        .substr(microtime(),2,5)
        .sprintf('%02d',rand(0,99));
    for(
        $a = md5( $rand, true ),
        $s = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',
        $d = '',
        $f = 0;
        $f < 6;
        $g = ord( $a[ $f ] ),
        $d .= $s[ ( $g ^ ord( $a[ $f + 8 ] ) ) - $g & 0x1F ],
        $f++
    );
    return $d;
}

/**
 * 时间格式化（时间戳）
 * @param $ptime
 * @return false|string
 */
function uc_time_ago($ptime)
{
    date_default_timezone_set('PRC');
    $etime = time() - $ptime;
    switch ($etime) {
        case $etime <= 60:
            $msg = '刚刚';
            break;
        case $etime > 60 && $etime <= 60 * 60:
            $msg = floor($etime / 60) . '分钟前';
            break;
        case $etime > 60 * 60 && $etime <= 24 * 60 * 60:
            $msg = date('Ymd', $ptime) == date('Ymd', time()) ? '今天 ' . date('H:i', $ptime) : '昨天 ' . date('H:i', $ptime);
            break;
        case $etime > 24 * 60 * 60 && $etime <= 2 * 24 * 60 * 60:
            $msg = date('Ymd', $ptime) + 1 == date('Ymd', time()) ? '昨天 ' . date('H:i', $ptime) : '前天 ' . date('H:i', $ptime);
            break;
        case $etime > 2 * 24 * 60 * 60 && $etime <= 12 * 30 * 24 * 60 * 60:
            $msg = date('Y', $ptime) == date('Y', time()) ? date('m-d H:i', $ptime) : date('Y-m-d H:i', $ptime);
            break;
        default:
            $msg = date('Y-m-d H:i', $ptime);
    }
    return $msg;
}



/**
 * 获取IP地址归属地
 * @param $ip
 * @return string
 */
function get_ip_address($ip)
{
    if ('127.0.0.1' == $ip) return 'Localhost';
    $url = 'http://ip.taobao.com/service/getIpInfo.php?ip=' . $ip;
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 获取数据返回
    $location = curl_exec($ch);
    $location = json_decode($location, true);
    curl_close($ch);

    if (false != $location && 0 === $location['code']) {
        return $location['data']['region'] . $location['data']['city'] . $location['data']['county'] . '・' . $location['data']['isp'];
    } else {
        return 'unknown';
    }

}

/**
 * 递归查询获取分类树结构
 * @param $data
 * @param int $pid
 * @param int $level
 * @param array $tree
 * @param string $pidField
 * @param string $showField
 * @return array
 */
function get_tree_list(&$data, $pid = 0, $level = 0, &$tree = [], $pidField = 'pid', $showField = 'name')
{
    foreach ($data as $key => &$value) {
        if ($value[$pidField] == $pid) {
            $value['level'] = $level;
            $value['level'] && $value[$showField] = '&nbsp;' . $value[$showField];
            $value[$showField] = str_repeat('ㅡ', $value['level']) . $value[$showField];
            $tree[] = $value;
            unset($data[$key]);
            get_tree_list($data, $value['id'], $level + 1, $tree);
        }
    }
    unset($value);

    return $tree;
}

/**
 * 递归查询获取分类树结构带child
 * @param $data
 * @param int $pid
 * @param int $level
 * @param string $pidField
 * @return array
 */
function get_tree_list_with_child(&$data, $pid = 0, $level = 0, $pidField = 'pid')
{
    $tree = [];
    foreach ($data as $key => &$value) {
        if ($value[$pidField] == $pid) {
            $value['level'] = $level;
            $value['child'] = get_tree_list_with_child($data, $value['id'], $level + 1);
            $tree[] = $value;
            unset($data[$key]);
        }
    }
    unset($value);

    return $tree;
}

/**
 * 打印sql语句，在sql语句之前调用
 */
function dump_sql()
{
    \DB::listen(function ($query) {
        $bindings = $query->bindings;
        $i = 0;
        $rawSql = preg_replace_callback('/\?/', function ($matches) use ($bindings, &$i) {
            $item = isset($bindings[$i]) ? $bindings[$i] : $matches[0];
            $i++;
            return gettype($item) == 'string' ? "'$item'" : $item;
        }, $query->sql);
        echo $rawSql . "\n<br /><br />\n";
    });
}

function create_guid($namespace = null)
{
    static $guid = '';
    $uid = uniqid("", true);

    $data = $namespace;
    $data .= $_SERVER ['REQUEST_TIME'];     // 请求那一刻的时间戳
    $data .= $_SERVER ['HTTP_USER_AGENT'];  // 获取访问者在用什么操作系统
    $data .= $_SERVER ['SERVER_ADDR'];      // 服务器IP
    $data .= $_SERVER ['SERVER_PORT'];      // 端口号
    $data .= $_SERVER ['REMOTE_ADDR'];      // 远程IP
    $data .= $_SERVER ['REMOTE_PORT'];      // 端口信息

    $hash = strtoupper(hash('ripemd128', $uid . $guid . md5($data)));
    $guid = substr($hash, 0, 8);

    return $guid;
}

function create_order_number()
{
    return date('Ymd') . str_pad(mt_rand(1, 999999), 6, '0', STR_PAD_LEFT);
}

/**
 * curl 请求
 * @param $url
 * @param null $header
 * @param null $data
 * @return mixed
 */
function curlRequest($url, $header = null, $data = null)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    if ($data) {
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    }
    if ($header) {
        curl_setopt($ch, CURLOPT_HEADER, $header);
    }
    $ret = curl_exec($ch);
    curl_close($ch);

    return $ret;
}

/**
 * 数字金额转换成中文大写金额的函数
 * @param $num
 * @return string
 */
function cny($num)
{

    $c1 = "零壹贰叁肆伍陆柒捌玖";
    $c2 = "分角元拾佰仟万拾佰仟亿";
    $num = round($num, 2);
    $num = $num * 100;
    if (strlen($num) > 10) {
        return "数据太长，没有这么大的钱吧，检查下";
    }
    $i = 0;
    $c = "";
    while (1) {
        if ($i == 0) {
            $n = substr($num, strlen($num) - 1, 1);
        } else {
            $n = $num % 10;
        }
        $p1 = substr($c1, 3 * $n, 3);
        $p2 = substr($c2, 3 * $i, 3);
        if ($n != '0' || ($n == '0' && ($p2 == '亿' || $p2 == '万' || $p2 == '元'))) {
            $c = $p1 . $p2 . $c;
        } else {
            $c = $p1 . $c;
        }
        $i = $i + 1;
        $num = $num / 10;
        $num = (int)$num;
        if ($num == 0) {
            break;
        }
    }
    $j = 0;
    $slen = strlen($c);
    while ($j < $slen) {
        $m = substr($c, $j, 6);
        if ($m == '零元' || $m == '零万' || $m == '零亿' || $m == '零零') {
            $left = substr($c, 0, $j);
            $right = substr($c, $j + 3);
            $c = $left . $right;
            $j = $j - 3;
            $slen = $slen - 3;
        }
        $j = $j + 3;
    }

    if (substr($c, strlen($c) - 3, 3) == '零') {
        $c = substr($c, 0, strlen($c) - 3);
    }
    if (empty($c)) {
        return "零元整";
    } else {
        return $c . "整";
    }
}

if (!function_exists('valid_url')) {
    /**
     * 路径助手函数
     * @param $url
     * @param null $disk_name
     * @param false $temp
     * @param null|DateTimeInterface  $expiration
     * @return string|null
     */
    function valid_url($url, $disk_name = null, $temp = false, $expiration = null)
    {
        if (is_null($url)) {
            return null;
        }

        if (filter_var($url, FILTER_VALIDATE_URL)) {
            return $url;
        }

        if ($temp) {
            $expiration = $expiration ?: now()->addMinutes(30);
            return Storage::disk($disk_name)->temporaryUrl($url, $expiration);
        }

        return Storage::disk($disk_name)->url($url);
    }
}

