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.WorkCentre;
import cn.wisenergy.model.app.WorkDept;
import cn.wisenergy.model.app.WorkProject;
import cn.wisenergy.model.app.WorkUser;
import cn.wisenergy.model.dto.ProjectDto;
import cn.wisenergy.model.enums.ManagerEnum;
import cn.wisenergy.service.WorkProjectService;
import cn.wisenergy.service.WorkUserService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
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<ProjectDto> getNameById(List<Integer> ids) {
        log.info("WorkProjectServiceImpl[]getNameById[]input.param.ids:" + ids);
        if (CollectionUtils.isEmpty(ids)) {
            throw new BaseCustomException(BASE_RESP_CODE_ENUM.INPUT_PARAM_IS_NULL);
        }
        List<WorkProject> workProjects = workProjectMapper.selectBatchIds(ids);
        if (CollectionUtils.isEmpty(workProjects)) {
            throw new BaseCustomException(BASE_RESP_CODE_ENUM.MANAGER_NOT_PROJECT);
        }
        return workProjectToDto(workProjects);
    }

    /**
     * 功能： 查询当前用户所管理的项目
     *
     * @param id 用户id
     * @return dto
     */
    @Override
    public List<ProjectDto> getByManagerId(Integer id) {
        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);
        List<WorkProject> workProjects = workProjectMapper.selectList(wrapper);
        if (CollectionUtils.isEmpty(workProjects)) {
            throw new BaseCustomException(BASE_RESP_CODE_ENUM.MANAGER_NOT_PROJECT);
        }

        return workProjectToDto(workProjects);
    }

    // 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 = new ArrayList<>();
        //存放查询条件
        HashMap<String, Object> map = new HashMap<>();
        //项目级别查询项目管理员为用户的项目
        if (user.getLevel().equals(ManagerEnum.IS_PROJECT_DIRECTOR.getCode())) {
            map.put("managerId", userId);
            workProjects = workProjectMapper.getProjectsByCriteria(map);
        }
        //用户是部门级别，查询该部门下的所有项目
        if (user.getLevel().equals(ManagerEnum.IS_DEPARTMENT_DIRECTOR.getCode())) {
            map.put("deptId", user.getDeptId());
            workProjects = workProjectMapper.getProjectsByCriteria(map);
        }
        //中心级别的用户查看中心下所有部门的所有项目
        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("centre_id",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;
    }
}
