<?php

use Phalcon\Debug\Dump;
use Phalcon\Logger;
use Phalcon\Logger\Adapter\Stream;
use SRVX\Utils\Common;

if (!function_exists('dd')) {
    /**
     * Dump the passed variables and end the script.
     *
     * @param mixed
     * @return void
     */
    function dd()
    {
        call_user_func_array('dump', func_get_args());

        die(1);
    }
}

if (!function_exists('dump')) {
    /**
     * Dump the passed variables without end the script.
     *
     * @param mixed
     * @return void
     */
    function dump()
    {
        array_map(function ($x) {
            $string = (new Dump([], true))->variable($x);

            echo(PHP_SAPI == 'cli' ? strip_tags($string) . PHP_EOL : $string);

        }, func_get_args());
    }
}

if (!function_exists('remove_script_tag')) {
    /**
     * @param $str
     * @return string|string[]|null
     */
    function remove_script_tag($str)
    {
        return preg_replace("/<script[\s\S]*?<\/script>/i", "", $str);
    }
}

if (!function_exists('match_img_url')) {
    /**
     * 匹配图片路径
     * @param $content
     * @return array
     */
    function match_img_url($content)
    {
        $preg = '/<img.*?src=[\"|\']?(.*?)[\"|\']?\s.*?>/i';
        preg_match_all($preg, $content, $match);
        $count    = count($match[1]);
        $fileList = [];
        if ($count > 0) {
            for ($i = 0; $i < $count; $i++) {
                $fileList[] = $match[1][$i];
            }
        }
        return $fileList;
    }
}

if (!function_exists('make_order_sn')) {
    /*
     * 生成32位唯一订单号码，格式：YYYY-MMDD-HHII-SS-APPID-NNNNNNNN-CC，其中：YYYY=年份，MM=月份，DD=日期，HH=24格式小时，II=分，SS=秒，NNNNNNNN=随机数，CC=检查码
     */
    function make_order_sn($appId)
    {
        @date_default_timezone_set("PRC");

        //订购日期
        $order_date = date('YmdHis');

        //订单号码主体（YYYY-MMDD-HHII-SS-UID-APPID-NNNNNNNN）
        $order_id_main = $order_date . $appId . rand(10000000, 99999999);

        //订单号码主体长度
        $order_id_len = strlen($order_id_main);

        $order_id_sum = 0;
        for ($i = 0; $i < $order_id_len; $i++) {
            $order_id_sum += (int)(substr($order_id_main, $i, 1));
        }

        //唯一订单号码（YYYYMMDDHHIISSNNNNNNNNCC）
        return $order_id_main . str_pad((100 - $order_id_sum % 100) % 100, 2, '0', STR_PAD_LEFT);
    }
}

if (!function_exists('make_self_order_sn')) {
    /*
     * 生成 支付联盟自定义订单号(app_id + 商户id + 毫妙时间戳 + CC(检查码))
     */
    function make_self_order_sn($appId, $merchantId)
    {
        @date_default_timezone_set("PRC");

        //订购日期
        $order_date = date('YmdHis');

        //订单号码主体（app_id-商户id-毫妙时间戳）
        $order_id_main = $appId . $merchantId . getMsecTime();

        //订单号码主体长度
        $order_id_len = strlen($order_id_main);

        $order_id_sum = 0;
        for ($i = 0; $i < $order_id_len; $i++) {
            $order_id_sum += (int)(substr($order_id_main, $i, 1));
        }

        //唯一订单号码（YYYYMMDDHHIISSNNNNNNNNCC）
        return $order_id_main . str_pad((100 - $order_id_sum % 100) % 100, 2, '0', STR_PAD_LEFT);
    }
}

if (!function_exists('logger')) {
    /**
     * Dump the passed variables and end the script.
     *
     * @param mixed
     * @return void
     */
    function logger($msg, $name = 'debug', $mode = false, $isForce = false)
    {
        //开启了debug模式才记录日志
        if (DEBUG || $isForce) {
            $time = time();
            if (file_exists(DIR_LOG)) {
                $path   = DIR_LOG . date('Y_m_d', $time) . '_' . $name . '.log';
                $logger = new Logger('messages', ['main' => new Stream($path),]);
                $msg    = is_array($msg) ? json_encode($msg, 320) : $msg;
                $ip     = Common::getRealIP() ? Common::getRealIP() : ' IP NULL ';
                $msg    = $ip . ' ' . $msg;
                $logger->debug($msg);
            } else {
                if ($mode) {
                    return;
                }
                @mkdir(DIR_LOG, 0755, true);
                logger($msg, $name, true);
            }
        }
    }
}

if (!function_exists('getAllHeaders')) {
    /**
     * 獲取http頭部信息
     * @return array
     */
    function getAllHeaders(): array
    {
        $headers = [];
        foreach ($_SERVER as $name => $value) {
            if (substr($name, 0, 5) == 'HTTP_') {
                $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
            }
        }
        return $headers;
    }
}

if (!function_exists('getMsecTime')) {
    /**
     * 获取毫秒级别的时间戳
     * @return float
     */
    function getMsecTime(): float
    {
        list($msec, $sec) = explode(' ', microtime());
        $msectime = (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);
        return $msectime;
    }
}

if (!function_exists('base64ContentSaveImage')) {
    /**
     * base64 存储至本地服务器作为图片
     * @param $base64_image_content
     * @return array|void
     */
    function base64ContentSaveImage($base64_image_content, $path = "upload/o2o_applet/") {
        if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_image_content, $result))
        {
            $type = $result[2];
            $new_file = $path.date('Ymd',time())."/";
            if(!file_exists($new_file))
            {
                //检查是否有该文件夹，如果没有就创建，并给予最高权限
                mkdir($new_file, 0700, true);
            }

            $new_file = $new_file.time().".{$type}";
            if (file_put_contents($new_file, base64_decode(str_replace($result[1], '', $base64_image_content))))
            {
                return ["result" => true, "path" => $new_file];
            }
            return ["result" => false, "path" => $new_file];
        }
    }
}


if (! function_exists('uniqid_nonce_str')) {
    /**
     * 通过 uniqid() 获取随机字符串
     *
     * @param int $sizeType  1 13位  2 32位 default ''
     * @return string
     */
    function uniqid_nonce_str(int $sizeType = 2) : string
    {
        if ($sizeType == 1) {
            return uniqid();
        } elseif ($sizeType == 2) {
            return md5(uniqid(microtime(true), true));
        } else {
            return '';
        }
    }
}
