<?php
/**
 * 控制器中间件: token检验，权限控制等
 * 错误代码：001
 *
 * @proDoc
 * @auth JOHN.W
 * @date 2019-08-28
 * @devUrl http://manage.repucar.test/v1/
 * @testUrl http://47.108.71.246:8081/v1/
 * @wiki http://47.108.71.246:8090/manage.html
 * @terminalType  pc
 * @qType api web
 * @roleType plat
 * @token c2bb6344086702f56b645238eb3ad418_api(or user)
 * @version v1.0
 * @title 精誉美车API
 * @desc 平台后台管理后台的api部分
 * @input-type application/x-www-form-urlencoded
 * @output-type application/json
 */

namespace app\modules\manage\v1\controllers;

use yii\web\Controller;
use Yii;
use yii\web\Response;
use app\modules\logic\model\RegionModel;

class MiddleController extends Controller
{
    //接收请求过来的post 或 get的参数
    public $para = array();
    /**
     * 用户信息
     */
    public $rec_role = array();

    public $has_return = false;

    /**
     * 无需权限也可访问的接口
     */
    public $arr_access_direct = array(
        'v1/manager/logout/',
        'v1/manager/debuginfo/',
        'v1/manager/editpwd/'
    );

    public $arr_export_path = array(
        'report/expstore/',
        'export/statistics/'

    );


    public function init()
    {
        $role_id = $this->token_chk();
        //权限控制
        if ($role_id > 0) {
            // $this->access_chk($role_id);
        }
    }
    

    protected function response($code, $info = '', $total = '', $controller = 'middle')
    {
        Yii::$app->db->close();
        $error_arr = Yii::$app->params['returnInfo'];
        $result = '';
        if (!isset($error_arr[$controller]) or !isset($error_arr[$controller][$code])) {
            if (isset($error_arr['middle'][$code])) {
                $result = $error_arr['middle'][$code];
            } elseif (isset($error_arr['default_error'][$code])) {
                $result = $error_arr['default_error'][$code];
            } else {
                $result = $error_arr['default_error']['not_find_error'];
            }
        } else {
            $result = $error_arr[$controller][$code];
        }
        if (!empty($result)) {
            $result['info'] = $info;
            if (isset($result['total'])) {
                $result['total'] = $total;
            }
        }
        Yii::$app->response->format = Response::FORMAT_JSON;
        Yii::$app->response->data = $result;
        Yii::$app->response->send();
    }

    /**
     *  验证token合法性，并返回role_id  API方式 token为md5(REPUCAR_MANAGE_API) c2bb6344086702f56b645238eb3ad418
     */
    private function token_chk()
    {

        $request = Yii::$app->request;

        $this->para = $request->post();
        if (YII_ENV_DEV and !empty($_GET['debug']) and $_GET['debug'] == true) {
            return;
        }
        //请求需要 token参数
        if (!array_key_exists('token', $this->para)) {
            return $this->response('token_miss');
        }
        //验证 token参数值的格式
        $arr_token = explode("_", $this->para['token']);
        //var_dump($arr_token);
        if (count($arr_token) != 2) {
            return $this->response('token_format_error');
        }
        if (!array_key_exists('qType', $this->para) || !in_array($this->para['qType'], array('api', 'web'))) {
            return $this->response('para_error_pub');
        }

        if (!in_array($arr_token[1], array('api', 'user'))) {
            return $this->response('token_format_error');
        }
        if ($arr_token[1] == 'api') {
            $token_server = md5('REPUCAR_MANAGE_API');
            if ($arr_token[0] != $token_server) {
                return $this->response('token_format_error', 'token错误');
            }
            $user_id = 0;
        } elseif ($arr_token[1] == 'user') {
            $redis = Yii::$app->redis;
            $redis_key = md5($arr_token[0] . "_" . "REPUCAR_MANAGE_USER");
            $s_value = $redis->get($redis_key);
            if ($s_value) {
                $token_info = unserialize($s_value);

                $gen_time = $token_info['gentime'];
                if (time() - $gen_time >= LOGIN_EXP_TIME) {
                    return $this->response('token_error', '时间过期');
                }
                $operator_id = $token_info['operator_id'];
                if ($this->para['roleType'] == "plat") {
                    $conn = Yii::$app->db;
                    $sql_admin = "select operator_id,group_id,login_key,username,operator_name from {{%operator}} where operator_id=:operator_id ";
                    $cmd = $conn->createCommand($sql_admin);
                    $cmd->bindValue(':operator_id', $operator_id);
                    $rec_user = $cmd->queryOne();
                    $this->rec_role = $rec_user;
                }
                $conn->close();
                if (empty($rec_user)) {
                    return $this->response('role_not_exist', '用户不存在,请核对账号密码，重新登录');
                }
                $login_key = $rec_user['login_key'];
                if ($login_key == '') {
                    return $this->response('login_key_empty', '已退出，请重新登录');
                }
                //多端登录限定
                $login_key_return = md5($rec_user['login_key'] . '_' . $operator_id);
                if ($arr_token[0] != $login_key_return) {
                    return $this->response('token_error', '账号已在其他端登录');
                }
                $user_id = $operator_id;
            } else {
                return $this->response('token_error', '登录状态已失效,请重新登录');
            }
        }


        return $user_id;
    }

    /**
     *  连接para的key.value成字符串
     */
    private function parse_para2str($para)
    {
        ksort($para);
        $str = '';
        foreach ($para as $k => $v) {
            $str .= $k . $v;
        }
        return $str;
    }

    /**
     *  用户访问权限控制
     */
    private function access_chk($role_id)
    {
        //用户id
        $role_id = intval($role_id);
        $conn = Yii::$app->db;

        if ($this->para['roleType'] == "plat") {
            $operator_id = $role_id;
            //获取用户信息
            $sql_admin = "select operator_id,group_id,role_id,username,operator_name,operator_title,phone,notes,is_freezed from {{%operator}} where operator_id=:operator_id ";
            $cmd = $conn->createCommand($sql_admin);
            $cmd->bindValue(':operator_id', $role_id);
            $this->rec_role = $cmd->queryOne();

            $path_info_access = Yii::$app->request->pathInfo;//当前请求的权限对应的路径
            //是否分配权限
            if (empty($this->rec_role['group_id'])) {
                return $this->response('access_deny', "该员工未分配权限组");
            }
            //获取所在权限组内具体权限
            $sql_group = "select `permission` from {{%permission_group}} where group_id ='" . $this->rec_role['group_id'] . "' ";
            $cmd = $conn->createCommand($sql_group);
            $role_group = $cmd->queryOne();
            if (!is_array($role_group) || empty($role_group)) {
                return $this->response('access_deny', "权限组不存在或为空");
            }

            $permissions = trim(preg_replace("/(,){2,}/i", ",", $role_group['permission']), ',');//逗号分隔 permission_id
            if ($permissions == '') {
                return $this->response('access_deny', "权限组未设置具体权限");
            }

            //获取权限对应的访问路径
            $sql_permission = "select path_info from {{%permission}} where permission_id in(" . $permissions . ") and is_used = 1 order by show_order asc";
            $cmd = $conn->createCommand($sql_permission);
            $role_permission = $cmd->queryAll();


            if (is_array($role_permission) && !empty($role_permission)) {
                $has_permission = false;
                foreach ($role_permission as $perm) {
                    if ($perm['path_info'] == $path_info_access) {
                        $has_permission = true;
                    }
                }
                if (in_array($path_info_access, $this->arr_access_direct)) {
                    $has_permission = true;
                }
                if (!$has_permission) {
                    return $this->response('access_deny', "无权限进行当前操作");
                }
            } else {
                return $this->response('access_deny', "权限为空");
            }
        }
        $conn->close();
    }

    /**
     *  用户登录时生成的login_key
     */
    public function gen_login_key()
    {
        return time() . '_' . rand(100000, 999999);
    }

    /**
     *  生成6位字符串，由0-9,a-z,A-Z,@#_ 构成
     */
    public function gen_salt()
    {
        $seed = array_merge(range(0, 9), range('a', 'z'), range('A', 'Z'), array('@', '#', '_'));

        $salt = '';
        $len = count($seed);
        for ($i = 0; $i < 6; $i++) {
            $rand = mt_rand(0, $len - 1);
            $salt .= $seed[$rand];
        }
        return $salt;
    }

    /**
     *  通过 operator_id ，获取 operator_name
     */
    public function get_operator_name($operator_id)
    {
        $conn = Yii::$app->db;
        $sql = "select operator_name from {{%operator}} where operator_id=:operator_id";
        $cmd = $conn->createCommand($sql);
        $cmd->bindValue(':operator_id', $operator_id);
        $rec = $cmd->queryOne();
        $conn->close();
        if (empty($rec)) {
            return "";
        } else {
            return $rec['operator_name'];
        }
    }

    /**
     *  通过 operator_id ，获取 phone
     */
    public function get_operator_phone($operator_id)
    {
        $conn = Yii::$app->db;
        $sql = "select phone from {{%operator}} where operator_id=:operator_id";
        $cmd = $conn->createCommand($sql);
        $cmd->bindValue(':operator_id', $operator_id);
        $rec = $cmd->queryOne();
        $conn->close();
        if (empty($rec)) {
            return "";
        } else {
            return $rec['phone'];
        }
    }

    /**
     *  通过 operator_id ，获取 operator_name
     */
    public function get_operator_name_multi($operator_id)
    {
        $conn = Yii::$app->db;
        $sql = "select operator_name from {{%operator}} where operator_id in(" . $operator_id . ")";
        $cmd = $conn->createCommand($sql);
        $res = $cmd->queryAll();
        $conn->close();
        if (empty($res)) {
            return "";
        } else {
            $arr_operator_name = $this->i_array_column($res, 'operator_name');
            $str_operator_name = implode(',', $arr_operator_name);
            return $str_operator_name;
        }
    }

    /**
     *  通过 id ，获取 path
     */
    public function get_img_path($id)
    {
        $conn = Yii::$app->db;
        $sql = "select `path` from {{%upload_file}} where id=:id";
        $cmd = $conn->createCommand($sql);
        $cmd->bindValue(':id', $id);
        $rec = $cmd->queryOne();
        $conn->close();
        if (empty($rec)) {
            return "";
        } else {
            return Yii::$app->params['imgurl'] . $rec['path'];
        }
    }

    /**
     * [cityname_str_to_array description]城市名字转换，字符串转数组，"[1],[2],[3]"转换成数组格式
     * @return [type] [description]
     */
    public function cityname_str_to_array($str)
    {
        $str_arr = explode(",",$str);

        foreach ($str_arr as $key => &$value) {
            $value = trim($value,'[]');
        }

        $model_data = RegionModel::find()->select('id,name')->where(['id'=>$str_arr])->asArray()->all();

        if (empty($model_data)) {
            return [];
        }else{
            return $model_data;
        }
    }

    /**
     * [cityname_str_to_handle description]城市名字转换成数据库保存格式，"1,2,3"转换成"[1],[2],[3]"
     * @return [type] [description]
     */
    public function cityname_str_to_handle($str)
    {
        $str_arr = explode(",",$str);

        foreach ($str_arr as $key => &$value) {
            $value = '['.$value.']';
        }

        return implode($str_arr,',');
    }
}
