package com.manage.controller;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.manage.dao.Power_NoticeMapper;
import com.manage.dao.Power_UserMapper;
import com.manage.encrypt.Base64;
import com.manage.encrypt.MD5;
import com.manage.entity.*;
import com.manage.service.*;
import com.manage.service.cache.Cache;
import com.manage.service.cache.CacheManager;
import com.manage.service.ipml.Power_NoticeServiceImpl;
import com.manage.util.DateUtils;
import com.manage.util.Msg;
import com.manage.vo.*;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.*;

/**
 * @ProjectName:
 * @Description:
 * @Param 传输参数
 * @Return
 * @Author: 曾文和
 * @CreateDate: 2019/7/9 15:07
 * @UpdateUser: 曾文和
 * @UpdateDate: 2019/7/9 15:07
 * @UpdateRemark: 更新说明
 * @Version: 1.0
 */
@Controller
@RequestMapping("font/")
public class FontController {
    @Autowired
    private PowerService powerService;
    @Autowired
    private User_Dept_MenuService userDeptMenuService;
    @Autowired
    private Power_NoticeMapper powerNoticeMapper;
    @Autowired
    private Power_UserMapper userMapper;
    @Autowired
    private Power_NoticeServiceImpl noticeService;
    @Autowired
    private Power_UserService userService;
    @Value("${TOKEN_EXPIRE_TIME}")
    private long TOKEN_EXPIRE_TIME;
    @Autowired
    private Power_MenuService powerMenuService;
    @Autowired
    private Power_DeptService power_deptService;

    /**
     * 2.1
     * @ProjectName:    getUserPowerTreeBySysFlag
     * @Description:    获取菜单通过系统标识
     * @Param           无
     * @Return          getMenusByUserIdAndSysFlag
     * @Author:         曾文和
     * @CreateDate:     2019/7/9 10:00
     * @UpdateUser:     更新者
     * @UpdateDate:     2019/7/9 10:00
     * @UpdateRemark:   更新说明
     * @Version:        1.0
     */
    @RequestMapping(value = "getMenusByUserIdAndSysFlag",method = RequestMethod.GET)
    @ResponseBody
    public Msg getMenusByUserIdAndSysFlag(String userName,String sysFlag,Integer userId,Integer roleId,
                                          Integer sysId,Integer hospitalId){
        try {
            if(StringUtils.isNotBlank(sysFlag) && StringUtils.isBlank(userName) &&  userId == null && roleId == null
                    && sysId == null && hospitalId == null){
                return Msg.fail("查询复杂,数据大,暂不支持只带sysFlag参数查询");
            }
            if(StringUtils.isBlank(sysFlag) && StringUtils.isBlank(userName) &&  userId == null && roleId == null
                    && sysId != null && hospitalId == null){
                return Msg.fail("查询复杂,数据大,暂不支持只带sysId参数查询");
            }
            if(StringUtils.isBlank(sysFlag) && StringUtils.isBlank(userName) &&  userId == null && roleId == null
                    && sysId == null && hospitalId != null){
                return Msg.fail("查询复杂,数据大,暂不支持只带hospitalId参数查询");
            }
            if(StringUtils.isNotBlank(userName)){
                List<Power_User> power_users = userMapper.checkUserName(userName);
                if(null != power_users && !power_users.isEmpty()){
                    if(power_users.get(0).getRoleId().equals(0) || power_users.get(0).getRoleId().equals(-100)){
                        roleId = power_users.get(0).getRoleId();
                    }
                }
            }

            List<User_Dept_Menu> list = userDeptMenuService.selectAll(userName, sysFlag, userId, roleId, sysId, hospitalId);
            CacheManager.addExcCount("noExc");
            return Msg.success().add("list",list);
        }catch(Exception e){
            CacheManager.addExcCount("exc");
            e.printStackTrace();
            return Msg.fail();
        }
    }

    /**
     * 2.2
     * @ProjectName:    selectAllByUserIdOrRoleIdAndSysIdOrSysFlag
     * @Description:    根据用户id或角色id和系统id或系统标识查询通知记录
     * @Param           无
     * @Return          selectAllByUserIdOrRoleIdAndSysIdOrSysFlag
     * @Author:         曾文和
     * @CreateDate:     2019/7/29 10:00
     * @UpdateUser:     更新者
     * @UpdateDate:     2019/7/29 10:00
     * @UpdateRemark:   更新说明
     * @Version:        1.0
     */
    @RequestMapping(value = "selectAllByUserIdOrRoleIdAndSysIdOrSysFlag")
    @ResponseBody
    public Msg selectAllByUserIdOrRoleIdAndSysIdOrSysFlag(Integer userId,Integer roleId,Integer sysId,String sysFlag){
        try {
            List<Power_Notice> list = powerNoticeMapper.selectAllByUserIdOrRoleIdAndSysIdOrSysFlag(userId, roleId, sysId, sysFlag);
            CacheManager.addExcCount("noExc");
            return Msg.success().add("list",list);
        }catch(Exception e){
            CacheManager.addExcCount("exc");
            e.printStackTrace();
            return Msg.fail();
        }
    }

    /**
     * 2.4
     * @ProjectName:    getUserPowerTreeBySysFlag
     * @Description:    获取系统用户树通过系统标识
     * @Param           无
     * @Return          PowerTree
     * @Author:         曾文和
     * @CreateDate:     2019/7/9 10:00
     * @UpdateUser:     更新者
     * @UpdateDate:     2019/7/9 10:00
     * @UpdateRemark:   更新说明
     * @Version:        1.0
     */
    @RequestMapping(value = "getUserPowerTreeBySysFlag",produces = {"text/json;charset=UTF-8"})
    @ResponseBody
    public String getUserPowerTreeBySysFlag(String sysFlag,Integer userId){
        try {
            if(null != userId){
                //查询该用户
                Power_UserVo user = userMapper.selectByPrimaryKey(userId);
                List<PowerTree> dicts = powerService.getUserPowerTreeBySysFlag(sysFlag,user);
                ObjectMapper mapper = new ObjectMapper();
                String json = mapper.writeValueAsString(dicts);
                CacheManager.addExcCount("noExc");
                return json;
            }else{
                return null;
            }
        }catch(Exception e){
            CacheManager.addExcCount("exc");
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 2.5
     * @ProjectName:    getRolePowerTreeBySysFlag
     * @Description:    获取系统角色树通过系统标识
     * @Param           无
     * @Return          PowerTree
     * @Author:         曾文和
     * @CreateDate:     2019/7/9 10:00
     * @UpdateUser:     更新者
     * @UpdateDate:     2019/7/9 10:00
     * @UpdateRemark:   更新说明
     * @Version:        1.0
     */
    @RequestMapping(value = "getRolePowerTreeBySysFlag",produces = {"text/json;charset=UTF-8"})
    @ResponseBody
    public String getRolePowerTreeBySysFlag(String sysFlag,Integer userId){
        try {
            if(null != userId){
                Power_UserVo user = userMapper.selectByPrimaryKey(userId);
                List<PowerTree> dicts = powerService.getRolePowerTreeBySysFlag(sysFlag,user);
                ObjectMapper mapper = new ObjectMapper();
                String json = mapper.writeValueAsString(dicts);
                CacheManager.addExcCount("noExc");
                return json;
            }else{
                return null;
            }
        }catch(Exception e){
            CacheManager.addExcCount("exc");
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 2.6
     * @ProjectName:    getUserList
     * @Description:    获取用户id和用户名
     * @Param           无
     * @Return          userList
     * @Author:         曾文和
     * @CreateDate:     2019/9/6 10:00
     * @UpdateUser:     更新者
     * @UpdateDate:     2019/9/6 10:00
     * @UpdateRemark:   更新说明
     * @Version:        1.0
     */
    @RequestMapping(value = "getUserList")
    @ResponseBody
    public Msg getUserList(String userName){
        try {
            List<User> list = new ArrayList<>();
            if(StringUtils.isNoneBlank(userName)){
                List<Power_User> users = userMapper.checkUserName(userName);
                if(null != users && !users.isEmpty()){
                    Integer roleId = users.get(0).getRoleId();
                    if(roleId == 0){
                        list = userMapper.selectUserIdAndUserNameList(null);
                    }else{
                        list = userMapper.selectUserIdAndUserNameList(users.get(0).getUserId());
                    }
                }
            }else{
                return Msg.fail("用户名不能为空");
            }
            CacheManager.addExcCount("noExc");
            return Msg.success().add("userList",list);
        }catch(Exception e){
            CacheManager.addExcCount("exc");
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 2.7
     * @ProjectName:    checkToken
     * @Description:    验证token是否有效
     * @Param           无
     * @Return          Msg
     * @Author:         曾文和
     * @CreateDate:     2019/9/24 10:00
     * @UpdateUser:     更新者
     * @UpdateDate:     2019/9/24 10:00
     * @UpdateRemark:   更新说明
     * @Version:        1.0
     */
    @RequestMapping(value = "checkToken",method = RequestMethod.POST)
    @ResponseBody
    public Msg checkToken(String token){
        try {
            if(StringUtils.isNotBlank(token) && StringUtils.isNotBlank(token) ) {
                token = MD5.JM(Base64.decode(token));
                Cache cache = CacheManager.getCacheInfo(token);
                if (cache == null) {
                    return Msg.fail("token已过期或不存在");
                }
            }else{
                return Msg.fail("token不能为空");
            }
            return Msg.success();
        }catch(Exception e){
            e.printStackTrace();
            return Msg.fail(e.getMessage());
        }
    }

    /**
     * 2.8
     * @ProjectName:    getUserByToken
     * @Description:    根据token获取用户
     * @Param           无
     * @Return          getMenuListByToken
     * @Author:         曾文和
     * @CreateDate:     2019/10/31 10:00
     * @UpdateUser:     更新者
     * @UpdateDate:     2019/10/31 10:00
     * @UpdateRemark:   更新说明
     * @Version:        1.0
     */
    @RequestMapping(value = "getUserByToken",method = RequestMethod.POST)
    @ResponseBody
    public Msg getMenuListByToken(String token,String sysFlag){
        try {
            if(StringUtils.isBlank(token)){
                return Msg.fail("token不能为空!");
            }
            if(StringUtils.isBlank(sysFlag)){
                return Msg.fail("sysFlag不能为空!");
            }
            token = MD5.JM(Base64.decode(token));
            Cache cacheInfo = CacheManager.getCacheInfo(token);
            Power_UserVo user = (Power_UserVo) cacheInfo.getValue();
            if(null != user){
                List<User_Dept_Menu> menuList = user.getMenuList();
                List<User_Dept_Menu> list = new ArrayList<>();
                Set<String> menus = new TreeSet<>();
                if(null != menuList && !menuList.isEmpty()){
                    for (int i = 0; i < menuList.size(); i++) {
                        String menuSysFlag = menuList.get(i).getSysFlag();
                        if(StringUtils.isNotBlank(menuSysFlag) && menuSysFlag.equals(sysFlag)){
                            list.add(menuList.get(i));
                            if(StringUtils.isNotBlank(menuList.get(i).getMethod())){
                                menus.add(menuList.get(i).getMenuUrl());
                            }
                        }
                    }
                }
                user.setMenuList(list);
                user.setMenus(menus);
                UserVo userVo = new UserVo();
                BeanUtils.copyProperties(user,userVo);
                //查询用户集合
                List<User> userList = new ArrayList<>();
                Integer roleId = userVo.getRoleId();
                if(roleId == 0){
                    userList = userMapper.selectUserIdAndUserNameList(null);
                }else{
                    userList = userMapper.selectUserIdAndUserNameList(userVo.getUserId());
                }
                //设置用户集合
                userVo.setUserList(userList);
                CacheManager.addExcCount("noExc");
                return Msg.success().add("user",userVo);
            }else{
                return Msg.fail("token已失效");
            }
        }catch(Exception e){
            CacheManager.addExcCount("exc");
            e.printStackTrace();
            return Msg.fail();
        }
    }

    /**
     * 2.9
     * @ProjectName:    getMenuByToken
     * @Description:    根据token获取菜单
     * @Param           无
     * @Return          getMenuListByToken
     * @Author:         曾文和
     * @CreateDate:     2019/10/31 10:00
     * @UpdateUser:     更新者
     * @UpdateDate:     2019/10/31 10:00
     * @UpdateRemark:   更新说明
     * @Version:        1.0
     */
    @RequestMapping(value = "getMenuByToken",method = RequestMethod.POST)
    @ResponseBody
    public Msg getMenuByToken(String token,String sysFlag){
        try {
            if(StringUtils.isBlank(token)){
                return Msg.fail("token不能为空!");
            }
            if(StringUtils.isBlank(sysFlag)){
                return Msg.fail("sysFlag不能为空!");
            }
            token = MD5.JM(Base64.decode(token));
            Cache cacheInfo = CacheManager.getCacheInfo(token);
            Power_UserVo user = (Power_UserVo) cacheInfo.getValue();
            List<User_Dept_Menu> menuList = user.getMenuList();
            List<User_Dept_Menu> list = new ArrayList<>();
            if(null != menuList && !menuList.isEmpty()){
                for (int i = 0; i < menuList.size(); i++) {
                    String menuSysFlag = menuList.get(i).getSysFlag();
                    if(StringUtils.isNotBlank(menuSysFlag) && menuSysFlag.equals(sysFlag)){
                        list.add(menuList.get(i));
                    }
                }
            }
            CacheManager.addExcCount("noExc");
            return Msg.success().add("list",list);
        }catch(Exception e){
            CacheManager.addExcCount("exc");
            e.printStackTrace();
            return Msg.fail();
        }
    }

    /**
     * 2.10
     * @ProjectName:    getToken
     * @Description:    获取token
     * @Param           无
     * @Return          Msg
     * @Author:         曾文和
     * @CreateDate:     2019/11/06 10:00
     * @UpdateUser:     更新者
     * @UpdateDate:     2019/11/06 10:00
     * @UpdateRemark:   更新说明
     * @Version:        1.0
     */
    @RequestMapping(value = "getToken",method = RequestMethod.POST)
    @ResponseBody
    public Msg getToken(String userName,String password){
        try {
            if(StringUtils.isBlank(userName)){
                return Msg.fail("用户名不能为空");
            }
            if(StringUtils.isBlank(password)){
                return Msg.fail("密码不能为空");
            }
            Power_User user = new Power_User();
            user.setUserName(userName);
            user.setRemark(password);
            Power_UserVo userVo = userService.findPowerUserByUserNameAndRemark(user);
            if(null == userVo){
                return Msg.fail("用户名或密码不正确");
            }
            String date = String.valueOf(DateUtils.getDate());
            String token = Base64.encode(MD5.KL(date));

            List<Power_Menu> list = null;
            List<User_Dept_Menu> menuList = new ArrayList<>();
            Set<String> menus = new TreeSet<>();
            if (userVo.getRoleId().equals(0) || userVo.getRoleId().equals(-100)) {
                list = powerMenuService.queryAllPowerMenu(null,userVo.getRoleId());
            } else {
                list = powerMenuService.selectUserAndRoleMenuListPower(userVo.getUserId(),null);
            }
            if(null != list && !list.isEmpty()){
                for (int i = 0; i < list.size(); i++) {
                    User_Dept_Menu deptMenu = new User_Dept_Menu();
                    String menuUrl = list.get(i).getMenuUrl();
                    if(StringUtils.isNotBlank(menuUrl)){
                        BeanUtils.copyProperties(list.get(i),deptMenu);
                        deptMenu.setMethodParent(list.get(i).getParentId());
                        menuList.add(deptMenu);
                    }
                    if(StringUtils.isNotBlank(list.get(i).getMethod())){
                        menus.add(list.get(i).getMenuUrl());
                    }
                }
            }
            userVo.setMenuList(menuList);
            userVo.setMenus(menus);

            //设置科室
            StringBuilder power_depts = new StringBuilder();
            List<Power_Dept> power_depts1 = power_deptService.selectByPrimaryKeys(userVo.getDeptId());
            for(int j=0;j<power_depts1.size();j++){
                if(j<power_depts1.size()-1){
                    power_depts.append(power_depts1.get(j).getDeptName()).append(",");
                }else{
                    power_depts.append(power_depts1.get(j).getDeptName());
                }
            }
            userVo.setRemark(power_depts.toString());
            //移除缓存
            CacheManager.removeCacheByObject(userVo);
            CacheManager.putCache(date,new Cache(date,userVo,TOKEN_EXPIRE_TIME));
            return Msg.success().add("token",token);
        }catch(Exception e){
            e.printStackTrace();
            return Msg.fail(e.getMessage());
        }
    }

    /**
     * 2.11
     * @MethodName getUnReadCount
     * @Description: 根据用户获取未读通知数量
     * @Param 无
     * @Returnt Msg
     * @Author: 曾文和
     * @CreateDate: 2019-10-17
     * @UpdateUser: 曾文和
     * @UpdateDate: 2019-10-17
     * @UpdateRemark: 更新说明
     * @Version: 1.2.2
     */
    @RequestMapping("notice/getUnReadCount")
    @ResponseBody
    public Msg getUnReadCount(Integer userId){
        try {
            if(null == userId){
                return Msg.fail("用户id不能为空");
            }
            Power_UserVo userVo = userMapper.selectByPrimaryKey(userId);
            if(null == userVo){
                return Msg.fail("用户id不存在");
            }
            int unReadCount = noticeService.getUnReadCount(userId);
            CacheManager.addExcCount("noExc");
            return Msg.success().add("unReadCount",unReadCount);
        }catch (Exception e){
            CacheManager.addExcCount("exc");
            e.printStackTrace();
            return Msg.fail(e.getMessage());
        }
    }
}
