package com.ruoyi.service.impl;

import com.ruoyi.domain.*;
import com.ruoyi.mapper.ReviewDetailsMapper;
import com.ruoyi.mapper.ReviewKeyPointMapper;
import com.ruoyi.mapper.ReviewSceneMapper;
import com.ruoyi.mapper.ReviewUsecaseMapper;
import com.ruoyi.service.StrategyReviewSceneChange;
import com.ruoyi.service.ReviewSceneChangeTaskService;
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.Objects;

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

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

    @Autowired
    private ReviewSceneMapper reviewSceneMapper;

    @Autowired
    private ReviewSceneChangeTaskService reviewSceneChangeTaskService;

    @Autowired
    private ReviewKeyPointMapper reviewKeyPointMapper;

    @Autowired
    private ReviewDetailsMapper reviewDetailsMapper;

    @Autowired
    private ReviewUsecaseMapper reviewUsecaseMapper;

    /**
     * 新增审查场景
     * @param reviewSceneChangeTask
     */
    @Override
    public void doChange(ReviewSceneChangeTask reviewSceneChangeTask) {

        if (Objects.equals(reviewSceneChangeTask.getOperationSort(), "ADD_SCENE")) {

            // 保存新增的场景
            ReviewScene reviewScene = new ReviewScene()
                    .setText(reviewSceneChangeTask.getNewText())
                    .setReviewDetailsId(reviewSceneChangeTask.getDetailsId());
            reviewSceneMapper.insert(reviewScene);

            // 为场景变更任务的 场景关联id字段赋值
            reviewSceneChangeTask.setReviewSceneId(reviewScene.getId());
            reviewSceneChangeTaskService.updateById(reviewSceneChangeTask);

        }

        // 保存新增的要点
        if (Objects.equals(reviewSceneChangeTask.getOperationSort(), "ADD_KEYPOINT")) {

            // 要点
            ReviewKeyPoint reviewKeyPoint = new ReviewKeyPoint()
                    .setText(reviewSceneChangeTask.getKeypoint())
                    .setReviewStandardId(reviewSceneChangeTask.getStandardId());
            reviewKeyPointMapper.insert(reviewKeyPoint);

            //为新增细则变更任务的细则关联id字段赋值
            reviewSceneChangeTask.setKeypointId(reviewKeyPoint.getId());
            reviewSceneChangeTaskService.updateById(reviewSceneChangeTask);


            // 细则
            ReviewDetails reviewDetails = new ReviewDetails()
                    .setText(reviewSceneChangeTask.getDetails())
                    .setReviewKeypointId(reviewKeyPoint.getId());
            reviewDetailsMapper.insert(reviewDetails);

            //为新增细则变更任务的细则关联id字段赋值
            reviewSceneChangeTask.setDetailsId(reviewDetails.getId());
            reviewSceneChangeTaskService.updateById(reviewSceneChangeTask);
        }

        // 保存新增的细则
        if (Objects.equals(reviewSceneChangeTask.getOperationSort(), "ADD_DETAILS")) {
            // 细则
            ReviewDetails reviewDetails = new ReviewDetails()
                    .setText(reviewSceneChangeTask.getDetails())
                    .setReviewKeypointId(reviewSceneChangeTask.getKeypointId());
            reviewDetailsMapper.insert(reviewDetails);

            //为新增细则变更任务的细则关联id字段赋值
            reviewSceneChangeTask.setDetailsId(reviewDetails.getId());
            reviewSceneChangeTaskService.updateById(reviewSceneChangeTask);
        }

        //新增测试用例评审
        if(Objects.equals(reviewSceneChangeTask.getOperationSort(),"ADD_USECASE")){
            //保存新增的测试用例
            ReviewUsecase reviewUsecase = new ReviewUsecase();
            reviewUsecase.setUsecaseDescribe(reviewSceneChangeTask.getUsecaseDescribe());
            reviewUsecase.setUsecaseId(reviewSceneChangeTask.getUsecaseId());
            reviewUsecase.setReviewStandardId(reviewSceneChangeTask.getStandardId());
            reviewUsecaseMapper.insert(reviewUsecase);
            //为用例变更任务的场景关联字段赋值
            reviewSceneChangeTask.setReviewUsecaseId(reviewUsecase.getId());
            reviewSceneChangeTaskService.updateById(reviewSceneChangeTask);
        }


    }

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