<?php
namespace fastphp;

//框架根目录
//use function Composer\Autoload\includeFile;

define('CORE_PATH', __DIR__);

/**
 * fastphp框架核心
 */
class Fastphp
{
    //配置内容
    protected $config = [];

    public function __construct($config)
    {
        $this->config = $config;
        require CORE_PATH . '/func/common.php';
    }

    //运行程序
    public function run()
    {
        global $is_script;
        spl_autoload_register(array($this, 'loadClass'));
        $this->origin();
        $this->setReporting();
        $this->unregisterGlobals();
        $this->setDbConfig();
        if (!$is_script) {
            $this->route();
        } else {
            if (isset($_SERVER['SERVER_NAME'])) {
                die;
            }
        }
    }

    //跨域请求处理
    public function origin()
    {
        $allow_origin = $this->config['origin']; //跨域访问的时候才会存在此字段
        $origin = isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : '';
        if (in_array($origin, $allow_origin)) {
            header('Access-Control-Allow-Origin:' . $origin);
            header("Access-Control-Allow-Methods: *");
            header('Access-Control-Allow-Headers:*');
            header("Access-Control-Allow-Credentials: true");
        } else {
            return;
        }
    }

    //路由处理
    public function route()
    {
        $controllerName = $this->config['defaultController'];
        $actionName = $this->config['defaultAction'];
        $param = array();

        $url = $_SERVER['REQUEST_URI'];
        //清除？之后的内容
        $position = strpos($url, '?');
        $url = $position === false ? $url : substr($url, 0, $position);
        //删除前后的/
        $url = trim($url, '/');

	
        //处理提交过来的参数
        if (isset($_GET['s'])) {
            unset($_GET['s']);
        }
        $get_data = json_encode($_GET).json_encode($_POST).file_get_contents("php://input");
        if ((stripos($get_data, 'substring') !== false)||(stripos($get_data, 'DUMPFILE') !== false)||(stripos($get_data, 'EXECUTE') !== false)||(stripos($get_data, 'TO_BASE64') !== false)||(stripos($get_data, 'insert') !== false)||(stripos($get_data, 'select') !== false)||(stripos($get_data, 'drop') !== false)||(stripos($get_data, 'grant') !== false)||(stripos($get_data, 'alert') !== false)||(stripos($get_data, 'UNION') !== false)||(stripos($get_data, 'OUTFILE') !== false)) {
            die;
        }

        if ($url) {
            //使用 / 分割
            $urlArray = explode('/', $url);
            //删除空的数组元素
            $urlArray = array_filter($urlArray);
            //获取控制器名
            $controllerName = array_shift($urlArray) . '\\controller\\' . ucfirst(array_shift($urlArray));

            //获取动作名
            $actionName = $urlArray ? array_shift($urlArray) : $actionName;

            //获取url参数
            $param = $urlArray ? $urlArray : array();
        }

        //判断控制器和操作是否存在
        $controller = 'app\\' . $controllerName;
        if (!class_exists($controller)) {
            die;
            exit($controller . '控制器不存在！');
        }
        if (!method_exists($controller, $actionName)) {
            die;
            exit($actionName . '方法不存在！');
        }

        //实例化控制器，这个后续结合controller基类一起看
        $dispatch = new $controller($controllerName, $actionName);

        //以下等同于$dispatch->$actionName($param);
        call_user_func_array(array($dispatch, $actionName), $param);
    }

    //检测开发环境
    public function setReporting()
    {
        if (APP_DEBUG === true) {
            error_reporting(E_ALL);
            ini_set('display_errors', 'On');
        } else {
            error_reporting(E_ALL);
            ini_set('display_errors', 'Off');
            ini_set('log_errors', 'On');
        }
    }

    //删除敏感字符
    public function stripSlashesDeep($value)
    {
        $value = is_array($value) ? array_map(array($this, 'stripSlashesDeep'), $value) : stripSlashes($value);
        return $value;
    }

    //检测自定义全局变量并移除
    public function unregisterGlobals()
    {
        if (ini_get('register_globals')) {
            $array = array('_SESSION', '_POST', '_GET', '_COOKIE', '_REQUEST', '_SERVER', '_ENV', '_FILES');
            foreach ($array as $value) {
                foreach ($GLOBALS[$value] as $key => $var) {
                    if ($var === $GLOBALS[$key]) {
                        unset($GLOBALS[$key]);
                    }
                }
            }
        }
    }

    //配置数据库信息
    public function setDbConfig()
    {
        global $is_script;
        $formal_origin = $this->config['formal_origin']; //跨域访问的时候才会存在此字段
        $origin = isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : '';
        $name = '';
        if(isset($_SERVER['LOGNAME'])){
            $name = $_SERVER['LOGNAME'];
        }
        if ((!in_array($origin, $formal_origin) && !$is_script) || $name == 'wyk') {
            define('DB_HOST', $this->config['db']['host']);
            define('DB_PORT', $this->config['db']['port']);
            define('DB_NAME', $this->config['db']['dbname']);
            define('DB_USER', $this->config['db']['username']);
            define('DB_PASS', $this->config['db']['password']);
        } else {
            define('DB_HOST', $this->config['formal_db']['host']);
            define('DB_PORT', $this->config['formal_db']['port']);
            define('DB_NAME', $this->config['formal_db']['dbname']);
            define('DB_USER', $this->config['formal_db']['username']);
            define('DB_PASS', $this->config['formal_db']['password']);
        }
    }

    //自动加载类
    public function loadClass($className)
    {
        $vendor = substr($className, 0, strpos($className, '\\'));
        $vendorDIR = $this->config['namespace'][$vendor];
        $filePath = substr($className, strlen($vendor)) . '.php';
        //包含应用文件
        $file = strtr($vendorDIR . $filePath, '\\', DIRECTORY_SEPARATOR);
        if (!is_file($file)) {
            return;
        }

        include $file;
    }

}
