package com.egojit.easyweb.upms.common.utils;

import com.egojit.easyweb.common.utils.CacheUtils;
import com.egojit.easyweb.common.utils.SpringContextHolder;
import com.egojit.easyweb.upms.dao.mapper.SysMenuMapper;
import com.egojit.easyweb.upms.dao.mapper.SysRoleMapper;
import com.egojit.easyweb.upms.dao.mapper.SysUserMapper;
import com.egojit.easyweb.upms.model.SysMenu;
import com.egojit.easyweb.upms.model.SysRole;
import com.egojit.easyweb.upms.model.SysUser;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.UnavailableSecurityManagerException;
import org.apache.shiro.session.InvalidSessionException;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;

import java.util.List;

/**
 * 备注:UserUtils 用户工具
 * 作者:egojit
 * 日期:2017/11/28
 */
public class UserUtils {

    private static SysUserMapper userMapper = SpringContextHolder.getBean(SysUserMapper.class);
    private static SysRoleMapper roleMapper = SpringContextHolder.getBean(SysRoleMapper.class);
    private static SysMenuMapper menuMapper = SpringContextHolder.getBean(SysMenuMapper.class);


    public static final String USER_CACHE = "userCache";
    public static final String USER_CACHE_ID_ = "id_";
    public static final String USER_CACHE_LOGIN_NAME_ = "ln";
    public static final String USER_CACHE_LIST_BY_OFFICE_ID_ = "oid_";

    public static final String CACHE_AUTH_INFO = "authInfo";
    public static final String CACHE_ROLE_LIST = "roleList";
    public static final String CACHE_MENU_LIST = "menuList";
    public static final String CACHE_AREA_LIST = "areaList";
    public static final String CACHE_OFFICE_LIST = "officeList";
    public static final String CACHE_OFFICE_ALL_LIST = "officeAllList";

//    /**
//     * 根据ID获取用户
//     * @param loginName 登录名
//     * @return 取不到返回null
//     */
//    public static SysUser get(String loginName){
//        SysUser user = (SysUser) CacheUtils.get(USER_CACHE, USER_CACHE_ID_ + loginName);
//        if (user ==  null){
//            user = getByLoginName(loginName);;
//            if (user == null){
//                return null;
//            }
////			user.setRoleList(roleMapper.getRolesByUser(user));
//            CacheUtils.put(USER_CACHE, USER_CACHE_ID_ + user.getId(), user);
//            CacheUtils.put(USER_CACHE, USER_CACHE_LOGIN_NAME_ + user.getLoginName(), user);
//        }
//        return user;
//    }

    /**
     * 根据登录名获取用户
     * @param loginName
     * @return 取不到返回null
     */
    public static SysUser getByLoginName(String loginName){
        SysUser user = (SysUser)CacheUtils.get(USER_CACHE, USER_CACHE_LOGIN_NAME_ + loginName);
        if (user == null){
            SysUser u=new SysUser();
            u.setLoginName(loginName);
            user = userMapper.getByLoginName(u);
            if (user == null){
                return null;
            }
//			user.setRoleList(roleMapper.getRolesByUser(user));
            CacheUtils.put(USER_CACHE, USER_CACHE_ID_ + user.getId(), user);
            CacheUtils.put(USER_CACHE, USER_CACHE_LOGIN_NAME_ + user.getLoginName(), user);
        }
        return user;
    }


    /**
     * 清除当前用户缓存
     */
    public static void clearCache(){
        removeCache(CACHE_AUTH_INFO);
        removeCache(CACHE_ROLE_LIST);
        removeCache(CACHE_MENU_LIST);
        removeCache(CACHE_AREA_LIST);
        removeCache(CACHE_OFFICE_LIST);
        removeCache(CACHE_OFFICE_ALL_LIST);
        UserUtils.clearCache(getUser());
    }

    /**
     * 清除指定用户缓存
     * @param user
     */
    public static void clearCache(SysUser user){
        CacheUtils.remove(USER_CACHE, USER_CACHE_ID_ + user.getId());
        CacheUtils.remove(USER_CACHE, USER_CACHE_LOGIN_NAME_ + user.getLoginName());
//		CacheUtils.remove(USER_CACHE, USER_CACHE_LOGIN_NAME_ + user.getOldLoginName());
//		if (user.getOffice() != null && user.getOffice().getId() != null){
//			CacheUtils.remove(USER_CACHE, USER_CACHE_LIST_BY_OFFICE_ID_ + user.getOffice().getId());
//		}
    }

    /**
     * 获取当前用户
     * @return 取不到返回 new User()
     */
    public static SysUser getUser(){
        String principal = getPrincipal();
        if (principal!=null){
            SysUser user = getByLoginName(principal);
            if (user != null){
                return user;
            }
            return new SysUser();
        }
        // 如果没有登录,则返回实例化空的User对象。
        return new SysUser();
    }

    /**
     * 获取当前用户角色列表
     * @return
     */
    public static List<SysRole> getRoleList(){
        @SuppressWarnings("unchecked")
        List<SysRole> roleList = (List<SysRole>)getCache(CACHE_ROLE_LIST);
        if (roleList == null){
            SysUser user = getUser();
            if (user.isAdmin()){
                roleList = roleMapper.selectAll();
            }else{
                SysRole role = new SysRole();
//				role.getSqlMap().put("dsf", BaseService.dataScopeFilter(user.getCurrentUser(), "o", "u"));
                roleList = roleMapper.select(role);
            }
            putCache(CACHE_ROLE_LIST, roleList);
        }
        return roleList;
    }

    /**
     * 获取当前用户授权菜单
     * @return
     */
    public static List<SysMenu> getMenuList(){
        @SuppressWarnings("unchecked")
        List<SysMenu> menuList = (List<SysMenu>)getCache(CACHE_MENU_LIST);
        if (menuList == null){
            SysUser user = getUser();
            if (user.isAdmin()){
                menuList = menuMapper.selectAll();
            }else{
                menuList = menuMapper.selectByUserId(user.getId());
            }
            putCache(CACHE_MENU_LIST, menuList);
        }
        return menuList;
    }

//	/**
//	 * 获取当前用户授权的区域
//	 * @return
//	 */
//	public static List<Area> getAreaList(){
//		@SuppressWarnings("unchecked")
//		List<Area> areaList = (List<Area>)getCache(CACHE_AREA_LIST);
//		if (areaList == null){
//			areaList = areaDao.findAllList(new Area());
//			putCache(CACHE_AREA_LIST, areaList);
//		}
//		return areaList;
//	}
//
//	/**
//	 * 获取当前用户有权限访问的部门
//	 * @return
//	 */
//	public static List<Office> getOfficeList(){
//		@SuppressWarnings("unchecked")
//		List<Office> officeList = (List<Office>)getCache(CACHE_OFFICE_LIST);
//		if (officeList == null){
//			User user = getUser();
//			if (user.isAdmin()){
//				officeList = officeDao.findAllList(new Office());
//			}else{
//				Office office = new Office();
////				office.getSqlMap().put("dsf", BaseService.dataScopeFilter(user, "a", ""));
//				officeList = officeDao.findList(office);
//			}
//			putCache(CACHE_OFFICE_LIST, officeList);
//		}
//		return officeList;
//	}
//
//	/**
//	 * 获取当前用户有权限访问的部门
//	 * @return
//	 */
//	public static List<Office> getOfficeAllList(){
//		@SuppressWarnings("unchecked")
//		List<Office> officeList = (List<Office>)getCache(CACHE_OFFICE_ALL_LIST);
//		if (officeList == null){
//			officeList = officeDao.findAllList(new Office());
//		}
//		return officeList;
//	}
//
    /**
     * 获取授权主要对象
     */
    public static Subject getSubject(){
        return SecurityUtils.getSubject();
    }

    /**
     * 获取当前登录者对象
     */
    public static String getPrincipal(){
        try{
            Subject subject = SecurityUtils.getSubject();
            String principal = (String)subject.getPrincipal();
            if (principal != null){
                return principal;
            }
//			subject.logout();
        }catch (UnavailableSecurityManagerException e) {

        }catch (InvalidSessionException e){

        }
        return null;
    }

    public static Session getSession(){
        try{
            Subject subject = SecurityUtils.getSubject();
            Session session = subject.getSession(false);
            if (session == null){
                session = subject.getSession();
            }
            if (session != null){
                return session;
            }
//			subject.logout();
        }catch (InvalidSessionException e){

        }
        return null;
    }

    // ============== User Cache ==============

    public static Object getCache(String key) {
        return getCache(key, null);
    }

    public static Object getCache(String key, Object defaultValue) {
//		Object obj = getCacheMap().get(key);
        Object obj = getSession().getAttribute(key);
        return obj==null?defaultValue:obj;
    }

    public static void putCache(String key, Object value) {
//		getCacheMap().put(key, value);
        getSession().setAttribute(key, value);
    }

    public static void removeCache(String key) {
//		getCacheMap().remove(key);
        getSession().removeAttribute(key);
    }
}