<?php

namespace Kuxin;

use App\Model\Stat\Spider;

/**
 * Class Request
 *
 * @package Kuxin
 * @author  Pakey <pakey@qq.com>
 */
class Request
{

    /**
     * @return bool
     */
    public static function isGet(): bool
    {
        return $_SERVER['REQUEST_METHOD'] === 'GET' ? true : false;

    }

    /**
     * @return bool
     */
    public static function isPost(): bool
    {
        return $_SERVER['REQUEST_METHOD'] === 'POST' ? true : false;
    }

    /**
     * @return bool
     */
    public static function isAjax(): bool
    {
        return ((isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') || isset($_POST['isajax']) || isset($_GET['isajax'])) ? true : false;
    }

    /**
     * @return bool
     */
    public static function isMobile(): bool
    {
        // 如果有HTTP_X_WAP_PROFILE则一定是移动设备
        if (isset ($_SERVER['HTTP_X_WAP_PROFILE'])) {
            return true;
        }
        // 如果via信息含有wap则一定是移动设备,部分服务商会屏蔽该信息
        if (isset ($_SERVER['HTTP_VIA'])) {
            // 找不到为flase,否则为true
            if (stristr($_SERVER['HTTP_VIA'], "wap")) {
                return true;
            }
        }
        // 脑残法，判断手机发送的客户端标志,兼容性有待提高
        if (isset ($_SERVER['HTTP_USER_AGENT'])) {
            $clientkeywords = [
                'nokia',
                'sony',
                'ericsson',
                'mot',
                'samsung',
                'htc',
                'sgh',
                'lg',
                'sharp',
                'sie-',
                'philips',
                'panasonic',
                'alcatel',
                'lenovo',
                'iphone',
                'ipod',
                'blackberry',
                'meizu',
                'android',
                'netfront',
                'symbian',
                'ucweb',
                'windowsce',
                'palm',
                'operamini',
                'operamobi',
                'openwave',
                'nexusone',
                'cldc',
                'midp',
                'wap',
                'mobile',
                'UCBrowser',
            ];
            // 从HTTP_USER_AGENT中查找手机浏览器的关键字
            if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT']))) {
                return true;
            }
        }
        // 协议法，因为有可能不准确，放到最后判断
        if (isset ($_SERVER['HTTP_ACCEPT'])) {
            // 如果只支持wml并且不支持html那一定是移动设备
            // 如果支持wml和html但是wml在html之前则是移动设备
            if ((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html')))) {
                return true;
            }
        }
        return false;
    }

    /**
     * @param string $ua
     * @return bool
     */
    public static function isSpider($ua = ''): bool
    {
        empty($ua) && $ua = $_SERVER['HTTP_USER_AGENT'];
        $ua      = strtolower($ua);
        $spiders = [ 'bot', 'crawl', 'spider', 'slurp', 'sohu-search', 'lycos', 'robozilla' ];
        foreach ($spiders as $spider) {
            if (false !== strpos($ua, $spider))
                return true;
        }
        //系统定义及自定义蜘蛛
        foreach (\App\Model\Spider::I()->getKeyWords() as $keyWord => $key) {
            if (trim($keyWord) && stripos($ua, $keyWord) !== false) {
                return true;
            }
        }
        return false;
    }

    /**
     * @param string $defaultIp
     * @return string
     */
    public static function getIp(string $defaultIp = '0.0.0.0'): string
    {
        $ip = $_SERVER['REMOTE_ADDR'];
        $i  = explode('.', $ip);
        if ($i[0] == 10 || ($i[0] == 172 && $i[1] > 15 && $i[1] < 32) || ($i[0] == 192 && $i[1] == 168)) {
            //如果是内网ip重新获取
            $keys = [ 'HTTP_X_FORWARDED_FOR', 'HTTP_CLIENT_IP', 'HTTP_X_REAL_IP' ];
            foreach ($keys as $key) {
                if (empty($_SERVER[$key]))
                    continue;
                $ips = explode(',', $_SERVER[$key], 1);
                $ip  = $ips[0];
                break;
            }
        }
        $l = ip2long($ip);
        if ((false !== $l) && ($ip === long2ip($l))) {
            return $ip;
        }
        return $defaultIp;
    }

    public static function isWechat($ua = '')
    {
        empty($ua) && $ua = $_SERVER['HTTP_USER_AGENT'];
        return strpos(strtolower($ua), 'micromessenger') !== false ? true : false;
    }

}