package com.ruoyi.service.impl;

import com.ruoyi.domain.ReviewDetails;
import com.ruoyi.domain.ReviewDetailsResult;
import com.ruoyi.domain.ReviewScene;
import com.ruoyi.domain.ReviewSceneChangeTask;
import com.ruoyi.mapper.ReviewDetailsMapper;
import com.ruoyi.mapper.ReviewDetailsResultMapper;
import com.ruoyi.mapper.ReviewKeyPointMapper;
import com.ruoyi.mapper.ReviewSceneMapper;
import com.ruoyi.service.ReviewDetailsService;
import com.ruoyi.service.ReviewKeyPointService;
import com.ruoyi.service.StrategyReviewSceneChange;
import com.ruoyi.service.ReviewSceneService;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Objects;

@Transactional
@Service
public class StrategyReviewSceneChangeDelete implements StrategyReviewSceneChange, InitializingBean {

    @Autowired
    private StrategyReviewSceneChangeContext strategyReviewSceneChangeContext;
    @Autowired
    private ApplicationContext applicationContext;

    @Autowired
    private ReviewSceneService reviewSceneService;

    @Autowired
    private ReviewKeyPointService reviewKeyPointService;

    @Autowired
    private ReviewDetailsService reviewDetailsService;

    @Autowired
    private ReviewDetailsMapper reviewDetailsMapper;

    @Autowired
    private ReviewSceneMapper reviewSceneMapper;

    @Autowired
    private ReviewDetailsResultMapper reviewDetailsResultMapper;

    @Override
    public void doChange(ReviewSceneChangeTask reviewSceneChangeTask) {
        // 删除场景
        if (Objects.equals(reviewSceneChangeTask.getOperationSort(), "DELETE_SCENE")) {
            reviewSceneService.removeById(reviewSceneChangeTask.getReviewSceneId());
        }

        // 删除要点
        if (Objects.equals(reviewSceneChangeTask.getOperationSort(), "DELETE_KEYPOINT")) {
            // 删除要点
            reviewKeyPointService.removeById(reviewSceneChangeTask.getKeypointId());

            // 删除包含的细则
            List<ReviewDetails> reviewDetailsList = reviewDetailsMapper.findByKeyPointId(reviewSceneChangeTask.getKeypointId());
            if (reviewDetailsList != null && reviewDetailsList.size() != 0) {
                reviewDetailsService.removeBatchByIds(reviewDetailsList);
            }

            // 删除细则对应的结果 (问卷是进行中的结果)
            List<ReviewDetailsResult> resultList = reviewDetailsResultMapper.findByDetailsList(reviewDetailsList);
            if (resultList != null && resultList.size() != 0) {
                reviewDetailsResultMapper.deleteBatchIds(resultList);
            }

            // 删除包含的场景
            List<ReviewScene> reviewScenesList = reviewSceneService.findByDetailsList(reviewDetailsList);
            if (reviewScenesList != null && reviewScenesList.size() != 0) {
                reviewSceneService.removeBatchByIds(reviewScenesList);
            }

        }

        // 删除细则
        if (Objects.equals(reviewSceneChangeTask.getOperationSort(), "DELETE_DETAILS")) {
            // 删除细则
            reviewDetailsService.removeById(reviewSceneChangeTask.getDetailsId());

            // 删除细则对应的结果 (问卷是进行中的结果)
            List<ReviewDetailsResult> resultList = reviewDetailsResultMapper.findByDetailsId(reviewSceneChangeTask.getDetailsId());
            if (resultList != null && resultList.size() != 0) {
                reviewDetailsResultMapper.deleteBatchIds(resultList);
            }

            // 删除包含的场景
            List<ReviewScene> reviewScenesList = reviewSceneMapper.findByDetailId(reviewSceneChangeTask.getDetailsId());
            if (reviewScenesList != null && reviewScenesList.size() != 0) {
                reviewSceneService.removeBatchByIds(reviewScenesList);
            }
        }
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        strategyReviewSceneChangeContext.putResource(ReviewSceneChangeTask.OPERATION_DELETE, applicationContext.getBean(this.getClass()));
    }
}