package com.ruoyi.doubledefense.service.impl;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.doubledefense.domain.CheckTask;
import com.ruoyi.doubledefense.dto.CheckTaskDTO;
import com.ruoyi.doubledefense.dto.res.CheckTaskResultDTO;
import com.ruoyi.doubledefense.dtoGov.CheckTaskDTOGov;
import com.ruoyi.doubledefense.mapper.CheckTaskMapper;
import com.ruoyi.doubledefense.service.ICheckTaskService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.util.Arrays;
import java.util.List;
import java.util.UUID;

/**
 * 隐患排查任务Service业务层处理
 *
 * @author ruoyi
 * @date 2023-08-03
 */
@Service
public class CheckTaskServiceImpl implements ICheckTaskService {
    @Autowired
    private CheckTaskMapper checkTaskMapper;

    /**
     * 重预防汇聚计算节点
     * 查询隐患排查要求
     *
     * @param checkTaskDTOGov
     * @return
     */
    @Override
    public PageInfo<CheckTaskDTOGov> govSelectCheckTaskList(CheckTaskDTOGov checkTaskDTOGov) {
        PageHelper.startPage(checkTaskDTOGov.getPageNo(), checkTaskDTOGov.getPageSize());
        List<CheckTaskDTOGov> dataList =checkTaskMapper.govSelectCheckTaskList(checkTaskDTOGov);
        PageInfo<CheckTaskDTOGov> pageInfo = new PageInfo<>(dataList);
        return pageInfo;
    }

    //    @Autowired
//    private CheckTaskPostRelationMapper checkTaskPostRelationMapper;

    /**
     * 查询隐患排查任务
     *
     * @param id 隐患排查任务主键
     * @return 隐患排查任务
     */
    @Override
    public CheckTaskResultDTO selectCheckTaskById(String id) {
        CheckTaskDTO checkTaskDTO = new CheckTaskDTO();
        checkTaskDTO.setId(id);
        List<CheckTaskResultDTO> checkTaskResultDTOS = selectCheckTaskList(checkTaskDTO);
        if (CollectionUtils.isEmpty(checkTaskResultDTOS)) {
            return null;
        }
        return checkTaskResultDTOS.get(0);
    }

    /**
     * 查询隐患排查任务列表
     *
     * @param checkTask 隐患排查任务
     * @return 隐患排查任务
     */
    @Override
    public List<CheckTaskResultDTO> selectCheckTaskList(CheckTaskDTO checkTask) {
        List<CheckTaskResultDTO> checkTaskResultDTOS = checkTaskMapper.selectCheckTaskList(checkTask);
//        if(!CollectionUtils.isEmpty(checkTaskResultDTOS)){
        //Task任务ID集合
//            List<String> checkTaskIdList = checkTaskResultDTOS.stream().map(CheckTaskResultDTO::getId).collect(Collectors.toList());
        //TaskID集合关联查询岗位表（sys_post）：岗位ID、岗位名称
//            List<CheckTaskPostDTO> checkTaskPostDTOS = checkTaskPostRelationMapper.selectCheckTaskPostByCheckTaskIdList(checkTaskIdList);
//            Map<String, List<CheckTaskPostDTO>> checkTaskPostMap = new HashMap<>();
//            if(!CollectionUtils.isEmpty(checkTaskPostDTOS)){
//                checkTaskPostMap  = checkTaskPostDTOS.stream().collect(Collectors.groupingBy(CheckTaskPostDTO::getCheckTaskId));
//            }
//            for(CheckTaskResultDTO checkTaskResultDTO : checkTaskResultDTOS){
//                checkTaskResultDTO.setCheckTaskPostDTOList(checkTaskPostMap.get(checkTaskResultDTO.getId()));
//                checkTaskResultDTO.setPostId();
//                checkTaskResultDTO.setPostName();
//            }
//        }
        return checkTaskResultDTOS;
    }

    /**
     * 新增隐患排查任务
     *
     * @param checkTaskDTO 隐患排查任务
     * @return 结果
     */
    @Override
    @Transactional
    public int insertCheckTask(CheckTaskDTO checkTaskDTO) {
        if (checkTaskDTO.getPostId() == null) {
            throw new BaseException("岗位ID为空！");
        }

        CheckTask checkTask = new CheckTask();
        BeanUtils.copyProperties(checkTaskDTO, checkTask);
        checkTask.setId(UUID.randomUUID().toString());
        checkTask.setCreateDefault();
        // 巡查方式：1-单位周期N次；2-时间段内1次；
        Long checkTypeCount = checkTask.getCheckTypeCount();
        if (checkTypeCount == null) {
            throw new BaseException("巡查方式为空，请选择！");
        } else if (checkTypeCount == 1) {
            checkTask.setStartDate(null);
            checkTask.setEndDate(null);
        } else if (checkTypeCount == 2) {
            checkTask.setCheckCycle(null);
            checkTask.setCheckCycleUnit(null);
        } else {
            throw new BaseException("巡查方式错误，请稍后重试！");
        }


        int count = checkTaskMapper.insert(checkTask);

//        List<Long> postIdList = checkTaskDTO.getPostIdList();
//        for(Long postId : postIdList){
//            CheckTaskPostRelation checkTaskPostRelation = new CheckTaskPostRelation();
//            checkTaskPostRelation.setCheckTaskId(checkTask.getId());
//            checkTaskPostRelation.setPostId(postId);
//            checkTaskPostRelation.setCreateDefault();
//            checkTaskPostRelationMapper.insert(checkTaskPostRelation);
//        }
        if (count <= 0) {
            throw new BaseException("系统错误（insert-" + count + "）！");
        }
        return count;
    }

    /**
     * 修改隐患排查任务
     *
     * @param checkTaskDTO 隐患排查任务
     * @return 结果
     */
    @Override
    @Transactional
    public int updateCheckTask(CheckTaskDTO checkTaskDTO) {
        if (checkTaskDTO.getPostId() == null) {
            throw new BaseException("岗位ID为空！");
        }
        CheckTask checkTask = new CheckTask();
        BeanUtils.copyProperties(checkTaskDTO, checkTask);
        checkTask.setUpdateDefault();

        // 巡查方式：1-单位周期N次；2-时间段内1次；
        Long checkTypeCount = checkTask.getCheckTypeCount();
        if (checkTypeCount == null) {
            throw new BaseException("巡查方式为空，请选择！");
        } else if (checkTypeCount == 1) {
            checkTask.setStartDate(null);
            checkTask.setEndDate(null);
            LambdaUpdateWrapper<CheckTask> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
            lambdaUpdateWrapper.set(CheckTask::getStartDate, null);
            lambdaUpdateWrapper.set(CheckTask::getEndDate, null);
            lambdaUpdateWrapper.eq(CheckTask::getId, checkTask.getId());
            checkTaskMapper.update(null, lambdaUpdateWrapper);
        } else if (checkTypeCount == 2) {
            checkTask.setCheckCycle(null);
            checkTask.setCheckCycleUnit(null);
            LambdaUpdateWrapper<CheckTask> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
            lambdaUpdateWrapper.set(CheckTask::getCheckCycle, null);
            lambdaUpdateWrapper.set(CheckTask::getCheckCycleUnit, null);
            lambdaUpdateWrapper.eq(CheckTask::getId, checkTask.getId());
            checkTaskMapper.update(null, lambdaUpdateWrapper);
        } else {
            throw new BaseException("巡查方式错误，请稍后重试！");
        }


        int count = checkTaskMapper.updateById(checkTask);
//        List<Long> postIdList = checkTaskDTO.getPostIdList();
//        QueryWrapper<CheckTaskPostRelation> queryWrapper = new QueryWrapper<>();
//        queryWrapper.eq("check_task_id", checkTaskDTO.getId());
//        checkTaskPostRelationMapper.delete(queryWrapper);
//        for (Long postId : postIdList) {
//            CheckTaskPostRelation checkTaskPostRelation = new CheckTaskPostRelation();
//            checkTaskPostRelation.setCheckTaskId(checkTask.getId());
//            checkTaskPostRelation.setPostId(postId);
//            checkTaskPostRelation.setCreateDefault();
//            checkTaskPostRelationMapper.insert(checkTaskPostRelation);
//        }
        if (count <= 0) {
            throw new BaseException("系统错误（update-" + count + "）！");
        }
        return count;
    }

    /**
     * 批量删除隐患排查任务
     *
     * @param ids 需要删除的隐患排查任务主键
     * @return 结果
     */
    @Override
    @Transactional
    public int deleteCheckTaskByIds(String[] ids) {
//        QueryWrapper<CheckTaskPostRelation> queryWrapper = new QueryWrapper<>();
//        queryWrapper.in("check_task_id", ids);
//        checkTaskPostRelationMapper.delete(queryWrapper);
        return checkTaskMapper.deleteBatchIds(Arrays.asList(ids));
    }

}
