package com.example.his.api.mis.service;


import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.digest.MD5;
import com.example.his.api.common.utils.CopyUtil;
import com.example.his.api.db.dao.PermissionDao;
import com.example.his.api.db.dao.UserDao;
import com.example.his.api.req.MisUser.UserExportExcel;
import com.example.his.api.resp.PermissionAllResp;
import com.example.his.api.resp.PermissionMenuResp;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class UserService {
    @Resource
    private UserDao userDao;

    @Resource
    private PermissionDao permissionDao;

    public Integer login(Map param) {
        String username = MapUtil.getStr(param, "username");
        String password = MapUtil.getStr(param, "password");
        MD5 md5 = MD5.create();
        String temp = md5.digestHex(username);
        String tempStart = StrUtil.subWithLength(temp, 0, 6);
        String tempEnd = StrUtil.subSuf(temp, temp.length() - 3);
        password = md5.digestHex(tempStart + password + tempEnd).toUpperCase();
        param.replace("password", password);
        Integer userId = userDao.login(param);
        return userId;
    }

    public int updatePassword(Map param) {
        int userId = MapUtil.getInt(param, "userId");
        String username = userDao.searchUsernameById(userId);
        MD5 md5 = MD5.create();
        String password = MapUtil.getStr(param, "password");
        String temp = md5.digestHex(username);
        String tempStart = StrUtil.subWithLength(temp, 0, 6);
        String tempEnd = StrUtil.subSuf(temp, temp.length() - 3);
        password = md5.digestHex(tempStart + password + tempEnd).toUpperCase();
        param.replace("password", password);
        String newPassword = MapUtil.getStr(param, "newPassword");
        newPassword = md5.digestHex(tempStart + newPassword + tempEnd).toUpperCase();
        param.replace("newPassword", newPassword);
        int rows = userDao.updatePassword(param);
        return rows;
    }

    // 用户管理-分页查询
    public PageInfo<HashMap> searchUserByPage(Map param) {
        PageHelper.startPage(MapUtil.getInt(param, "pageNum"), MapUtil.getInt(param, "pageSize"));
        ArrayList<HashMap> list = userDao.searchUserByPage(param);
        PageInfo<HashMap> pageInfo = new PageInfo<>(list);
        return pageInfo;
    }

    // 用户管理-新增
    public int insertUser(Map param) {
        return userDao.insertUser(param);
    }

    // 用户管理-编辑
    public int updateUser(Map param) {
        return userDao.updateUser(param);
    }

    // 用户管理-删除
    public int deleteUser(Integer id) {
        return userDao.deleteUser(id);
    }

    // 用户管理-批量删除
    public int deleteBatchUser(Map param) {
        return userDao.deleteBatchUser(param);
    }

    // 用户管理-导出
    public List<UserExportExcel> searchUserAll() {
        return userDao.searchUserAll();
    }

    // 用户管理-查询权限
    public List<PermissionAllResp> searchPermissions(List<String> permissions) {
        return permissionDao.searchUserPermissions(permissions);
    }

    // 用户管理-查询权限递归菜单
    public List<PermissionMenuResp> searchPermissionsMenu(List<PermissionAllResp> permissions) {
        List<PermissionMenuResp> list = CopyUtil.copyList(permissions, PermissionMenuResp.class);
        return deepTree(list);
    }

    // 查询当前医生的摘要信息
    public HashMap searchDoctorById(int userId) {
        HashMap map = userDao.searchDoctorById(userId);
        return map;
    }

    /**
     * 转换树形结构
     *
     * @param menuList
     * @return
     */
    public List<PermissionMenuResp> deepTree(List<PermissionMenuResp> menuList) {
        //创建list集合，用于数据最终封装
        List<PermissionMenuResp> finalNode = new ArrayList<>();

        for (PermissionMenuResp menus : menuList) {
            Integer topId = 0;
            //判断Pid是否等于0  0是最高的节点 将查询出的数据放进list集合
            if (topId.equals(menus.getParentId())) {
                finalNode.add(selectTree(menus, menuList));
            }


        }
        // 递归设置节点层级
        for (PermissionMenuResp menu : finalNode) {
            setNodeLevel(menu, 1);
        }

        return finalNode;
    }

    public PermissionMenuResp selectTree(PermissionMenuResp m1, List<PermissionMenuResp> menuList) {
        //因为向一层菜单里面放二层菜单，二层里面还要放三层，把对象初始化
        m1.setChildren(new ArrayList<PermissionMenuResp>());
        //遍历所有菜单list集合，进行判断比较，比较id和pid值是否相同
        for (PermissionMenuResp m2 : menuList) {
            //判断 id和pid值是否相同
            if (m1.getId().equals(m2.getParentId())) {
                //如果children为空，进行初始化操作
                if (m1.getChildren() == null) {
                    m1.setChildren(new ArrayList<PermissionMenuResp>());
                }
                //把查询出来的子菜单放到父菜单里面
                m1.getChildren().add(selectTree(m2, menuList));
            }
        }
        return m1;
    }

    // 递归设置节点层级
    public void setNodeLevel(PermissionMenuResp node, int level) {
        node.setLevel(level);
        node.setKey(node.getId());
        for (PermissionMenuResp child : node.getChildren()) {
            setNodeLevel(child, level + 1);
        }
    }


}

