<?php
namespace app\middleware;

use Closure;
use app\model\AuthRule;
use think\facade\Cache;

class Auth 
{
    public function handle($request, Closure $next)
    {
        $auth = session('auth');
        if(!$auth){
            return redirect(url('manager.login/index'));
        }
        // 角色权限
        $rules = Cache::get('group_rules_'.$auth['groupId']);
        $ruleNames = Cache::get('rule_names_'.$auth['groupId']);
        //如果是超级管理员,不用验证权限,给予所有权限
        if(empty($rules)){
            $ruleNames = [];
            if($auth['groupId'] == 1){
                $rules = AuthRule::getListTree(0);
            }else{
                // 角色权限 + 基本权限
                $rules = AuthRule::getAuthListByRuleIDs($auth['groupId']);
            }
            foreach($rules as &$rule){
                if(!stripos($rule['name'],'/')){
                    $rule['name'] = $rule['name'].'/index';
                }
                $ruleNames[] = strtolower($rule['name']);
                if(isset($rule['children']) && !empty($rule['children'])){
                    foreach($rule['children'] as &$child){
                        if(!stripos($child['name'],'/')){
                            $child['name'] = $child['name'].'/index';
                        }
                        $ruleNames[] = strtolower($child['name']);
                    }
                }
                
            }
            // 对角色赋予权限缓存,角色权限更新时需要同步更新缓存
            Cache::set('group_rules_'.$auth['groupId'], $rules);
            Cache::set('rule_names_'.$auth['groupId'], $ruleNames);
        }
        if($auth['groupId'] == 1){
            return $next($request);
        }

        $controller = strtolower(request()->controller());
        $controller = str_replace('manager.', '', $controller);
        $action = request()->action();
        $name = strtolower($controller.'/'.$action);
        if(!empty($ruleNames) && in_array($name, $ruleNames, true)){
            return $next($request);
        }
        if(request()->isAjax()){
            return json(['code' => 1,'msg' => '没有权限']);
        }else{
            exit('无操作权限') ;
        }
        
    }
}