package com.dcit.authority.shiro;

import java.util.Map;
import java.util.Set;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;

import com.dcit.authority.utils.JsonWebTokenUtil;


/**
 * Shiro工具类
 * @author zhangzhizhong
 * 2020年4月25日
 */
public class ShiroKit {
	
	/**
     * 判断当前用户是否是超级管理员
     */
    /*public static boolean isAdmin() {
        List<Long> roleList = ShiroKit.getUser().getRoleList();
        for (Long integer : roleList) {
            String singleRoleTip = ConstantFactory.me().getSingleRoleTip(integer);
            if (singleRoleTip.equals(Const.ADMIN_NAME)) {
                return true;
            }
        }
        return false;
    }*/
	
	/**
     * 获取当前 Subject
     *
     * @return Subject
     */
    public static Subject getSubject() {
        return SecurityUtils.getSubject();
    }
    
    /**
     * 获取payloadMap
     * @return
     */
    public static Map<String, Object> payloadMap(){
    	
    	String jwtStr = (String)getSubject().getPrincipals().getPrimaryPrincipal();
    	Map<String, Object> payloadMap = JsonWebTokenUtil.readValue(jwtStr.substring(4));
    	return payloadMap;
    }
    
    /**
     * 获取当前用户id
     * @return
     */
    public static String getUserId(){
    	
    	Set<String> userId = JsonWebTokenUtil.split((String)payloadMap().get("userId"));
    	
    	return userId.iterator().next();
    }
    
    /**
     * 获取当前用户帐号
     * @return
     */
    public static String getUserAccount(){
    	
    	Set<String> account = JsonWebTokenUtil.split((String)payloadMap().get("account"));
    	
    	return account.iterator().next();
    }
    
    /**
     * 已认证通过的用户。不包含已记住的用户，这是与user标签的区别所在。与notAuthenticated搭配使用
     *
     * @return 通过身份验证：true，否则false
     */
    public static boolean isAuthenticated() {
        return getSubject() != null && getSubject().isAuthenticated();
    }

    /**
     * 未认证通过用户，与authenticated标签相对应。与guest标签的区别是，该标签包含已记住用户。。
     *
     * @return 没有通过身份验证：true，否则false
     */
    public static boolean notAuthenticated() {
        return !isAuthenticated();
    }

    /**
     * 认证通过或已记住的用户。与guset搭配使用。
     *
     * @return 用户：true，否则 false
     */
    public static boolean isUser() {
        return getSubject() != null && getSubject().getPrincipal() != null;
    }

    /**
     * 验证当前用户是否为“访客”，即未认证（包含未记住）的用户。用user搭配使用
     *
     * @return 访客：true，否则false
     */
    public static boolean isGuest() {
        return !isUser();
    }

    /**
     * 输出当前用户信息，通常为登录帐号信息。
     *
     * @return 当前用户信息
     */
    public static String principal() {
        if (getSubject() != null) {
            Object principal = getSubject().getPrincipal();
            return principal.toString();
        }
        return "";
    }

}
