<?php


namespace api\action;


use servers\jwt\jwt;

/**
 * Class baseAction
 * @package action
 */
class baseAction extends \action
{
    private $loginFile = '\api\action\v1\loginAction\index';
    public $accessKeyId = '';
    public $cfg = [];
    public $usersql = '';
    public $userParams = []; //有权限的请求参数
    public function __construct()
    {
        $header = PHP_SAPI == 'apache2handler' ? apache_request_headers() : $_SERVER;

        $classFile = \mvc::$cfg['class'].'\\'.\mvc::$cfg['method'];
        if($classFile != $this->loginFile)
        {
            if (!$header['x-token']) $this->returnJson(0,'Error Processing Request');
            $input['loginInfo'] = jwt::verifyToken($header['x-token']);
            if ($input['loginInfo'] == false) $this->returnJson(0,'无效token');
            
            $userInfo = \mvc::$cfg['InterfaceUserInformation'];
            foreach ($userInfo as $item){
                if(md5($item['AccessKeyId'])==$input['loginInfo']['iss']){
                    $this->accessKeyId = $item['AccessKeyId'];
                    break;
                }
            }
            preg_match('/\/v\d+\/([a-z0-9]+)Action/i',str_replace('\\','/',\mvc::$class),$m);
            $listCfgFilename =  sprintf("%s/power/api_list.php",\mvc::$cfg['dir']['site']);
            if(file_exists($listCfgFilename)){
                $listCfg = require_once($listCfgFilename);
                if(isset($listCfg[$this->accessKeyId])){
                    if(!in_array($m[1].'.'.\mvc::$method, $listCfg[$this->accessKeyId]))  $this->returnJson(0,'无此接口权限');
                }
            }
            
            $cfgFilename =  sprintf("%s/power/%s/%s.%s.php",\mvc::$cfg['dir']['site'],$this->accessKeyId,$m[1],\mvc::$method);
            if(file_exists($cfgFilename)){
               $this->cfg = require_once($cfgFilename);
               if(isset($this->cfg['sql']) && trim($this->cfg['sql'])!=''){
                    $this->usersql = $this->cfg['sql'];
               }
               if(isset($this->cfg['params']) && trim($this->cfg['params'])!=''){
                    $arr = preg_split("[,|\r\n|\n]",trim($this->cfg['params']));
                    $params = [];
                    foreach($arr as $v){
                        $v = trim($v);
                        if($v!='')
                            $params[] = $v;
                    }
                    $this->userParams = $params;
               }
               
            }
        }
    }
    
    /**
     * 取规则中的值
     */
    protected function getRule($key)
    {
        if(isset($this->cfg) && isset($this->cfg['rules']) && isset($this->cfg['rules'][$key])){
            return $this->cfg['rules'][$key];
        }
        return [];
    }
    
    /**
     * @throws Exception
     */
    protected function checkHeader()
    {
        if($_SERVER['CONTENT_TYPE'] !== 'application/json')
        {
            return $this->returnJson(0,'header 错误',[]);
        }
        $headers = array();

        foreach ($_SERVER as $key => $value)
        {
            if ('HTTP_' == substr($key, 0, 5))
            {
                $headers[str_replace('_', '-', substr($key, 5))] = $value;
            }
        }
        if (isset($_SERVER['PHP_AUTH_DIGEST'])) {
            $headers['AUTHORIZATION'] = $_SERVER['PHP_AUTH_DIGEST'];
        } elseif (isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW'])) {
            $header['AUTHORIZATION'] = base64_encode($_SERVER['PHP_AUTH_USER'] . ':' . $_SERVER['PHP_AUTH_PW']);
        }
        if (isset($_SERVER['CONTENT_LENGTH'])) {
            $headers['CONTENT-LENGTH'] = $_SERVER['CONTENT_LENGTH'];
        }
        if (isset($_SERVER['CONTENT_TYPE'])) {
            $headers['CONTENT-TYPE'] = $_SERVER['CONTENT_TYPE'];
        }
    }

    /**
     * 格式化用户SQL
     */
    public function formatUserSql(string $sql, array $params=[])
    {
        $result = $sql;
        foreach($params as $k=>$v){
            $result = str_replace('<'.$k.'>',$v,$result);
        }
        return $result;
    }

    /**
     * 过滤字段
     */
    protected function filterFieldRows(array $data)
    {
        if(empty($this->cfg) || !isset($this->cfg['fields']) || trim($this->cfg['fields'])=='')
            return $data;
            
        $arr = preg_split("[,|\r\n|\n]",trim($this->cfg['fields']));
        $fields = [];
        foreach($arr as $v){
            $v = trim($v);
            if($v!='')
                $fields[] = $v;
        }
        if(isset($data[0])){
            foreach($data as $k=>$v){
                $this->filterField($fields,$data[$k]);
            }
        }else{
           $this->filterField($fields,$data);
        }
        return $data;
    }
    protected function filterField(array $fields, array &$data, string $fix='')
    {
        foreach($data as $k=>$v){
            $name = ($fix=='') ? $k : $fix.'.'.$k;
            if(!in_array($name,$fields)){
                unset($data[$k]);
            }else if(is_array($v)){
                $this->filterField($fields,$data[$k],$name);
            }
        }
    }

    /**
     * @param int $code
     * @param string $msg
     * @param array|null $data
     * @throws Exception
     */
    protected function returnJson(int $code, string $msg = '', array $data = [])
    {
        try {
            if($code==200 && !empty($this->cfg)) $data = $this->filterFieldRows($data);
            $data = [
                'code' => $code,
                'msg' => $msg,
                'data' => $data
            ];
            // 返回JSON数据格式到客户端 包含状态信息
            $data = json_encode($data,JSON_UNESCAPED_UNICODE);

            if ($data === false) {
                throw new \InvalidArgumentException(json_last_error_msg());
            }
            header('Access-Control-Allow-Origin' , '*');
            header('Access-Control-Allow-Methods'  , 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
            header('Access-Control-Allow-Headers' , 'X-Requested-With,content-type');
            header('Access-Control-Allow-Credentials' ,  true);
            header('Content-Type','application/json');
			ob_clean();
            echo  $data;
            if (function_exists('fastcgi_finish_request')) {
                // 提高页面响应
                fastcgi_finish_request();
            }
        } catch (\Exception $e) {
            if ($e->getPrevious()) {
                throw $e->getPrevious();
            }
            throw $e;
        }
        exit();
    }

    public function getUserInfo($userName)
    {
        $userInfo = \mvc::$cfg['InterfaceUserInformation'];
        foreach ($userInfo as $key => $value){
            if($userName == md5($value['AccessKeyId'])){
                return $value['AccessKeyId'];
            }
        }
        return false;
    }

    public function getParaam()
    {
        $input = file_get_contents('php://input');
        $post = json_decode($input,JSON_UNESCAPED_UNICODE);
		if(empty($post)){
			exit('错误:没有提供任何参数');
		}
        return $post;
    }
    /**
     * 取gsp api1 token 图纸
     */
    public function getGspAPI1_token(){
        $token_url = \mvc::$cfg['gspAPI1']['TOKEN_URL'];
        $params = \mvc::$cfg['gspAPI1']['TOKEN_PASS'];
        $header = \mvc::$cfg['gspAPI1']['TOKEN_AUTHORIZATION'];
        $json = ioPost($token_url,$params,$header);
        $arr = json_decode($json,true);
        if( isset($arr['access_token']) ){
            return $arr['access_token'];
        }else{
            return '';
        }
    }

    
}