package com.ruoyi.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.constant.HttpStatus;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.domain.CarReviewTask;
import com.ruoyi.domain.ReviewStandard;
import com.ruoyi.domain.SystemReviewTask;
import com.ruoyi.domain.ReviewTaskInbox;
import com.ruoyi.service.CarReviewTaskService;
import com.ruoyi.service.ReviewTaskInboxService;
import com.ruoyi.mapper.ReviewTaskInboxMapper;
import com.ruoyi.service.SystemReviewTaskService;
import com.ruoyi.web.request.ReviewTaskInboxConfirmRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

/**
* @author wangfei
* @description 针对表【t_system_review_task_inbox(体系审查任务收件箱(目前用来获取审查场景变更通知))】的数据库操作Service实现
* @createDate 2023-12-26 09:55:39
*/
@Transactional
@Service
public class ReviewTaskInboxServiceImpl extends ServiceImpl<ReviewTaskInboxMapper, ReviewTaskInbox> implements ReviewTaskInboxService {

    @Autowired
    private SystemReviewTaskService systemReviewTaskService;

    @Autowired
    private CarReviewTaskService carReviewTaskService;

    @Autowired
    private ReviewTaskInboxMapper reviewTaskInboxMapper;

    /**
     * 保存场景变更对进行中的问卷产生的影响,用于提醒问卷使用者场景发生了变更。
     * 体系审查任务、侧性审查任务分别查询不同的表
     * @param reviewSceneChangeTaskId
     * @param type
     */
    @Override
    public void saveNotify(Long reviewSceneChangeTaskId, String type) {

        if(ReviewStandard.TYPE_SYSTEM.equals(type)) {
            doSaveNotifyBySystemReview(reviewSceneChangeTaskId);

        } else if(ReviewStandard.TYPE_CAR.equals(type)) {
            doSaveNotifyByCarReview(reviewSceneChangeTaskId);

        } else {
            throw new ServiceException("未知的检查类型[" + type + "]",HttpStatus.ERROR);
        }

    }

    @Override
    public void confirm(ReviewTaskInboxConfirmRequest request) {
        List<ReviewTaskInbox> inboxList = reviewTaskInboxMapper.findConfirmList(request.getReviewTaskId(),request.getDetailsId());

        for (ReviewTaskInbox inbox : inboxList) {
            inbox.setIsConfirm(1);
            reviewTaskInboxMapper.updateById(inbox);
        }

    }

    public void doSaveNotifyByCarReview(Long reviewSceneChangeTaskId) {

        // 查找所有受变更影响的体系审查任务(所有PENDING状态的任务)
        List<CarReviewTask> pendingTasks = carReviewTaskService.findListByStatus(CarReviewTask.TASK_STATUS_PENDING);

        // 构建并保存提醒消息
        List<ReviewTaskInbox> inboxes = new ArrayList();
        for(CarReviewTask task : pendingTasks) {
            ReviewTaskInbox inbox = new ReviewTaskInbox()
                    .setReviewSceneChangeTaskId(reviewSceneChangeTaskId)
                    .setReviewTaskId(task.getId())
                    .setIsConfirm(0);
            inboxes.add(inbox);
        }

        saveBatch(inboxes);
    }

    public void doSaveNotifyBySystemReview(Long reviewSceneChangeTaskId) {

        // 查找所有受变更影响的体系审查任务(所有PENDING状态的任务)
        List<SystemReviewTask> pendingTasks = systemReviewTaskService.findListByStatus(SystemReviewTask.STATUS_PENDING);

        // 构建并保存提醒消息
        List<ReviewTaskInbox> inboxes = new ArrayList();
        for(SystemReviewTask task : pendingTasks) {
            ReviewTaskInbox inbox = new ReviewTaskInbox()
                    .setReviewSceneChangeTaskId(reviewSceneChangeTaskId)
                    .setReviewTaskId(task.getId())
                    .setIsConfirm(0);
            inboxes.add(inbox);
        }

        saveBatch(inboxes);

    }
}