<?php

namespace app\home\middleware;

use app\model\UserModel;
use think\facade\Cache;
use think\facade\Config;
use think\Request;

/**
 * @desc 必须要登陆的接口 校验是否登陆
 */
class AuthMiddleware
{

    public function handle(Request $request, \Closure  $next)
    {

        // OPTIONS 请求直接返回空响应
        if ($request->method(true) === 'OPTIONS') {
            return response()->send();
        }
        $header = $request->header();
        if(!isset($header['language'])){
            $request->lang=Config::get('lang.default_lang');
        }else{
            $lang_list=Config::get('lang.allow_lang_list');
            $lang=strtolower($header['language']);
            if(in_array($lang,$lang_list)){
                $request->lang=$lang;
            }else{
                $request->lang=Config::get('lang.default_lang');
            }
        }
        if(empty($header['token'])){
            return json(['code' => '100403', 'message' => 'login please','data' => []]);
        }
        if(!is_string($header['token'])){
            return json(['code' => '100403', 'message' => 'login please','data' => []]);
        }

        $tokenUserKey = 'TOKEN:USER:'.$header['token'];
        $userId = Cache::store('redis')->get($tokenUserKey);
        if(empty($userId) || $userId <= 0){
            return json(['code' => '100403', 'message' => 'login please','data' => []]);
        }

        // 查找用户信息
        $user = UserModel::getFieldsByUserId('status,user_id', $userId);
        if(empty($user)){
            return json(['code' => '100403', 'message' => 'no user','data' => []]);
        }

        if($user['status'] != UserModel::STATUS_ON){
            return json(['code' => '100403', 'message' => 'no auth','data' => []]);
        }

        $request->userId = $userId;
        $userTokenKey = 'USER:TOKEN:'.$request->userId;

        $expire = 30 * 24 * 60 * 60;
        Cache::store('redis')->set($userTokenKey, $header['token'], $expire);
        Cache::store('redis')->set($tokenUserKey, $request->userId, $expire);
        return $next($request);

    }
}