<?php
namespace Base\Tool;

/**
 * @author elf<360197197@qq.com>
 */
class Request {

    private $serverInfo;
    private $scheme;

    public function __construct()
    {
        $this->serverInfo = $_SERVER;
    }

    public function isWechat()
    {
        $userAgent = $this->getUserAgent();
        if (strpos($userAgent, 'MicroMessenger') == false && strpos($userAgent, 'Windows Phone') == false) {
            return false;
        } else {
            return true;
        }
    }

    public function getUserAgent()
    {
        return $this->serverInfo['HTTP_USER_AGENT'] ?? '';
    }

    public function isMobile()
    {
        $isMobile = false;
        $userAgent = $this->getUserAgent();
        $mobileAgents = ['Android', 'iPhone', 'SymbianOS', 'Windows Phone', 'iPad', 'iPod'];
        foreach ($mobileAgents as $mobileAgent) {
            if (stripos($userAgent, $mobileAgent) !== false) {
                $isMobile = true;
            }
        }
        return $isMobile;
    }

    public function isIOS()
    {
        $userAgent = $this->getUserAgent();
        if(stripos($userAgent, 'iphone') !== false || stripos($userAgent, 'ipad') !== false || stripos($userAgent, 'ipod') !== false) {
            return true;
        }
        return false;
    }

    public function isAndroid()
    {
        $userAgent = $this->getUserAgent();
        if(stripos($userAgent, 'android')) {
            return true;
        }
        return false;
    }
    
    public function isIOS13()
    {
        $userAgent = $this->getUserAgent();
        // if (preg_match('/OS [1][3-9]_[1-9][_\d]* like Mac OS X/i', $userAgent)) {
        if (preg_match('/OS.*[1][3-9]_[1-9][_\d]*.*like.*Mac.*OS.*X/i', $userAgent)) {
            return true;
        }
        return false;
    }

    /**
     * 获取客户端IP
     */
    public function getClientIP()
    {
        $serverInfo = $this->serverInfo;
        $ip = '0.0.0.0';
        if (isset($serverInfo['HTTP_X_FORWARDED_FOR'])) {
            $items = explode(',', $serverInfo['HTTP_X_FORWARDED_FOR']);
            $position = array_search('unknown', $items);
            if (false !== $position) {
                unset($items[$position]);
            }
            $ip = trim($items[0]);
        } elseif (isset($serverInfo['HTTP_CLIENT_IP'])) {
            $ip = $serverInfo['HTTP_CLIENT_IP'];
        } elseif (isset($this->serverInfo['REMOTE_ADDR'])) {
            $ip = $serverInfo['REMOTE_ADDR'];
        }
        return $ip;
    }

    public function getHost()
    {
        $host = $this->getScheme() . '://' . $this->serverInfo['SERVER_NAME'];
        if (in_array($this->serverInfo['SERVER_PORT'], [80, 443])) {
            return $host;
        }
        return $host . ':' . $this->serverInfo['SERVER_PORT'];
    }

    public function getScheme()
    {
        if ($this->scheme) {
            return $this->scheme;
        }
        $serverInfo = $this->serverInfo;
        if (isset($serverInfo['REQUEST_SCHEME'])) {
            $this->scheme = $serverInfo['REQUEST_SCHEME'];
            return $this->scheme;
        }
        if ((isset($serverInfo['HTTPS']) && $serverInfo['HTTPS'] == 'on') 
            || (isset($serverInfo['HTTP_X_FORWARDED_PROTO']) && $serverInfo['HTTP_X_FORWARDED_PROTO'] == 'https'
            || (isset($serverInfo['SERVER_PORT']) && $serverInfo['SERVER_PORT'] == 443))
        ) {
            $this->scheme = 'https';
        } else {
            $this->scheme = 'http';
        }
        return $this->scheme;
    }
}