package cn.wisenergy.service.impl;

import cn.wisenergy.common.utils.exception.BASE_RESP_CODE_ENUM;
import cn.wisenergy.common.utils.exception.BaseCustomException;
import cn.wisenergy.mapper.WorkCentreMapper;
import cn.wisenergy.mapper.WorkDeptMapper;
import cn.wisenergy.mapper.WorkProjectMapper;
import cn.wisenergy.model.app.*;
import cn.wisenergy.model.dto.ManagerProjectsDto;
import cn.wisenergy.model.dto.ProjectDto;
import cn.wisenergy.model.enums.LevelRankEnum;
import cn.wisenergy.model.enums.ManagerEnum;
import cn.wisenergy.model.vo.GetManagerProjectsVo;
import cn.wisenergy.service.WorkProjectService;
import cn.wisenergy.service.WorkUserService;
import cn.wisenergy.service.utils.UserRoleLevelUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author chenqi
 * @since 2021-01-19
 */
@Service
@Slf4j
public class WorkProjectServiceImpl implements WorkProjectService {

    @Autowired
    private WorkProjectMapper workProjectMapper;

    @Autowired
    private WorkUserService workUserService;

    @Autowired
    private WorkDeptMapper workDeptMapper;

    @Autowired
    private WorkCentreMapper workCentreMapper;

    /**
     * 功能：根据项目id获取项目
     *
     * @param id 项目id
     * @return WorkProject
     */
    @Override
    public WorkProject getById(Integer id) {
        log.info("WorkProjectServiceImpl[]getById[]input.param.id:" + id);
        if (null == id) {
            throw new BaseCustomException(BASE_RESP_CODE_ENUM.INPUT_PARAM_IS_NULL);
        }
        WorkProject workProject = workProjectMapper.selectById(id);
        if (null == workProject) {
            return null;
        }
        return workProject;
    }

    @Override
    public List<WorkProject> getNameByIds(List<Integer> ids, Integer isConclusion) {
        log.info("WorkProjectServiceImpl[]getNameById[]input.param.ids:" + ids);
        if (CollectionUtils.isEmpty(ids)) {
            return null;
        }
        List<WorkProject> workProjects = workProjectMapper.getProjectsByIds(ids, isConclusion);
        if (CollectionUtils.isEmpty(workProjects)) {
            throw new BaseCustomException(BASE_RESP_CODE_ENUM.MANAGER_NOT_PROJECT);
        }
        return workProjects;
    }

    /**
     * 功能： 查询当前用户所管理的项目
     *
     * @param id 用户id
     * @return dto
     */
    @Override
    public List<ProjectDto> getByManagerId(Integer id, Integer isConclusion) {
        log.info("WorkProjectServiceImpl[]getByManagerId[]input.param.id:" + id);
        if (null == id) {
            throw new BaseCustomException(BASE_RESP_CODE_ENUM.INPUT_PARAM_IS_NULL);
        }
        QueryWrapper<WorkProject> wrapper = new QueryWrapper<>();
        wrapper.eq("manager_id", id);
        wrapper.eq("is_conclusion", isConclusion);
        List<WorkProject> workProjects = workProjectMapper.selectList(wrapper);
        if (!CollectionUtils.isEmpty(workProjects)) {
            return workProjectToDto(workProjects);
        }
        return null;
    }

    /**WorkProject转ProjectDto*/
    private List<ProjectDto> workProjectToDto(List<WorkProject> workProjects) {
        List<ProjectDto> projectDtos = new ArrayList<>();

        for (WorkProject workProject : workProjects) {
            ProjectDto projectDto = new ProjectDto();
            BeanUtils.copyProperties(workProject, projectDto);
            projectDtos.add(projectDto);
        }

        return projectDtos;
    }


    @Override
    public List<WorkProject> getUserManageProjects(Integer userId) {
        log.info("WorkProjectServiceImpl[]getUserManageProjects[]input.param" + userId);
        if (userId == null) {
            throw new BaseCustomException(BASE_RESP_CODE_ENUM.INPUT_PARAM_IS_NULL);
        }
        WorkUser user = workUserService.getById(userId);
        //普通用户
        if (user.getLevel().equals(ManagerEnum.NOT_MANAGER)) {
            throw new BaseCustomException(BASE_RESP_CODE_ENUM.THE_USER_NOT_MANAGER_PLASE_MANAGER_LOGIN);
        }
        //存放项目列表
        List<WorkProject> workProjects;
        //存放查询条件
        HashMap<String, Object> map = new HashMap<>();

        // 查询项目表中管理为用户的项目集合，用户为项目经理，但level可能不为1
            map.put("managerId", userId);
        //用户是部门级别，查询该部门下的所有项目
        if (user.getLevel().equals(ManagerEnum.IS_DEPARTMENT_DIRECTOR.getCode())) {
            map.put("deptId", user.getDeptId());
        }
        //中心级别的用户查看中心下所有部门的所有项目
        if (user.getLevel().equals(ManagerEnum.IS_CENTRE_DIRECTOR.getCode())) {
            //获取中心信息
            WorkCentre workCentre = workCentreMapper.getByManagerId(user.getId());
            if (workCentre == null) {
                throw new BaseCustomException(BASE_RESP_CODE_ENUM.CENTRE_NOT_FOUND);
            }
            map.put("centreId",workCentre.getId());
            //获取中心下的部门信息
            List<WorkDept> workDepts = workDeptMapper.getDeptByCondition(map);
            if (CollectionUtils.isEmpty(workDepts)) {
                throw new BaseCustomException(BASE_RESP_CODE_ENUM.DEPT_NOT_FOUND);
            }
            //获取这些部门的主键
            List<Integer> deptIds = workDepts.stream().map(WorkDept::getId).collect(Collectors.toList());
            map.clear();
            map.put("deptIds", deptIds);
        }
        workProjects = workProjectMapper.getProjectsByCriteria(map);

        return workProjects;
    }

    @Override
    public PageInfo getManagerProjects(GetManagerProjectsVo gmpv) {
        if (null == gmpv) {
            throw new BaseCustomException(BASE_RESP_CODE_ENUM.INPUT_PARAM_IS_NULL);
        }
        // 判断user是否是管理
        WorkUser user = workUserService.getById(gmpv.getUserId());
        if (null == user) {
            throw new BaseCustomException(BASE_RESP_CODE_ENUM.QUERY_USER_INFO_FAIL);
        }

        // 判断用户权限
        List<Integer> roles = UserRoleLevelUtils.getRole(gmpv.getUserId());
        if (roles.get(0).equals(ManagerEnum.NOT_MANAGER.getCode())) {
            throw new BaseCustomException(BASE_RESP_CODE_ENUM.THE_USER_NOT_MANAGER_PLASE_MANAGER_LOGIN);
        }
        List<Integer> levelIds = UserRoleLevelUtils.getlevelIds(roles);
        if (CollectionUtils.isEmpty(levelIds)) {
            throw new BaseCustomException(BASE_RESP_CODE_ENUM.LEAVE_JOB_USER);
        }
        List<WorkLevel> workLevels = UserRoleLevelUtils.getlevelByIds(levelIds);
        if (CollectionUtils.isEmpty(workLevels)) {
            throw new BaseCustomException(BASE_RESP_CODE_ENUM.LEAVE_JOB_USER);
        }
        for (WorkLevel workLevel : workLevels) {
            System.out.println("workLevel = " + workLevel);
        }

        Integer rank = null;
        for (WorkLevel level : workLevels) {
            if ("项目/商机管理".equals(level.getName())) {
                rank = level.getRank();
                break;
            }
        }
        if (null == rank) {
            throw new BaseCustomException(BASE_RESP_CODE_ENUM.LEAVE_JOB_USER);
        }

        int page = gmpv.getPage() == null ? 1 : gmpv.getPage();
        int pageSize = gmpv.getPageSize() == null ? 10 : gmpv.getPageSize();
        int isConclusion = gmpv.getIsConclusion() == null ? 1 : gmpv.getIsConclusion();
        int type = gmpv.getType() == null ? 1 : gmpv.getType();
        PageHelper.startPage(page, pageSize);
        List<ManagerProjectsDto> managerProjectsDto;

        // 中心负责人
        if (rank.equals(LevelRankEnum.CENTRAL_LEVEL.getRank())) {
            List<Integer> deptIds = new ArrayList<>();
            WorkCentre workCentre = workCentreMapper.getByManagerId(user.getId());
            HashMap<String, Object> map = new HashMap<>(5);
            map.put("centre_id", workCentre.getId());
            List<WorkDept> workDeptList = workDeptMapper.getDeptByCondition(map);
            workDeptList.forEach(workDept -> deptIds.add(workDept.getId()));
            managerProjectsDto = workProjectMapper.getManagerProjectsDto(gmpv.getUserId(), type, isConclusion, deptIds);
            return returnPageInfo(managerProjectsDto);
        }
        // 部门经理
        if (rank.equals(LevelRankEnum.DEPARTMENT_LEVEL.getRank())) {
            List<Integer> deptIds = new ArrayList<>();
            deptIds.add(user.getDeptId());
            managerProjectsDto = workProjectMapper.getManagerProjectsDto(gmpv.getUserId(), type, isConclusion, deptIds);
            return returnPageInfo(managerProjectsDto);
        }
        // 项目经理
        if (rank.equals(LevelRankEnum.PROJECT_LEVEL.getRank())) {
            managerProjectsDto = workProjectMapper.getManagerProjectsDto(gmpv.getUserId(), type, isConclusion, null);
            return returnPageInfo(managerProjectsDto);
        }
        throw new BaseCustomException(BASE_RESP_CODE_ENUM.LEAVE_JOB_USER);
    }

    private PageInfo returnPageInfo(List<ManagerProjectsDto> managerProjectsDto) {
        if (CollectionUtils.isEmpty(managerProjectsDto)) {
            throw new BaseCustomException(BASE_RESP_CODE_ENUM.WORK_PROJECT_IS_NULL);
        }
        PageInfo pageInfo = new PageInfo<>(managerProjectsDto);
        pageInfo.setList(managerProjectsDto);
        return pageInfo;
    }
}
