package com.ruoyi.service.impl;

import com.ruoyi.common.DataStatisticsUtils;
import com.ruoyi.common.constant.HttpStatus;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.domain.*;
import com.ruoyi.domain.vo.ReviewEnterpriseArchiveFileVO;
import com.ruoyi.mapper.*;
import com.ruoyi.service.*;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.web.response.CarReviewTaskViewResponse;
import com.ruoyi.web.response.UserNameResponse;
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.math.BigDecimal;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

import static com.ruoyi.common.DataStatisticsUtils.calculateStandardsPass;

@Transactional
@Service
public class StrategyCarReviewTaskPending implements StrategyCarReviewTask, InitializingBean {

    @Autowired
    private StrategyCarReviewTaskContext strategyCarReviewTaskContext;
    @Autowired
    private ApplicationContext applicationContext;

    @Autowired
    private ReviewStandardService reviewStandardService;

    @Autowired
    private ReviewDetailsResultService reviewDetailsResultService;

    @Autowired
    private ReviewSceneChangeTaskService reviewSceneChangeTaskService;

    @Autowired
    private CarReviewTaskMapper carReviewTaskMapper;

    @Autowired
    private ReviewDetailsResultMapper reviewDetailsResultMapper;

    @Autowired
    private ReviewDetailsMapper reviewDetailsMapper;

    @Autowired
    private ReviewTaskInboxMapper reviewTaskInboxMapper;

    @Autowired
    private TaskMapper taskMapper;

    @Autowired
    private TaskSampleRelationMapper taskSampleRelationMapper;

    @Autowired
    private SampleManagementMapper sampleManagementMapper;

    @Autowired
    private ReviewEnterpriseArchiveMapper reviewEnterpriseArchiveMapper;

    @Autowired
    private ReviewKeyPointService reviewKeyPointService;

    @Autowired
    private ReviewDetailsService reviewDetailsService;

    @Autowired
    private ReviewStandardMapper reviewStandardMapper;

    @Autowired
    private TaskUserRelationMapper taskUserRelationMapper;

    @Autowired
    private AutomobileEnterpriseMapper automobileEnterpriseMapper;

    @Autowired
    private ISysUserService sysUserService;

    // PENDING状态下
    // 1.standard字段查询当前最新问卷
    // 2.查询场景变更任务
    // 3.需要联查问卷答案
    @Override
    public CarReviewTaskViewResponse doView(CarReviewTask carReviewTask) {
        // 获取最新问卷
        List<ReviewStandard> standardTree = reviewStandardService.findTree(carReviewTask.getStandardId(), ReviewStandard.TYPE_CAR);

        // 获取当前问卷答案
        List<ReviewDetailsResult> results = reviewDetailsResultService.findByTaskId(carReviewTask.getId());

        // 绑定问卷与答案
        setDetailsResult(standardTree, results,carReviewTask);

        // 赋值给任务
        carReviewTask.setStandard(standardTree);

        // 查询场景变更任务便于提醒用户场景变动
        List<ReviewSceneChangeTask> lastChanges = reviewSceneChangeTaskService.findLastChangeByTaskId(carReviewTask.getId());

        // 任务样品关系
        List<TaskSampleRelation> sampleRelations = taskSampleRelationMapper.selectByTaskId(taskMapper.findByCarReviewTaskId(carReviewTask.getId()),TaskSampleRelation.COMPLETE_VEHICLE_SAMPLE);

        // 获取第一个整车样品对应的生产企业
        TaskSampleRelation taskSampleRelation = sampleRelations.get(0);
        Sample sample = sampleManagementMapper.selectSampleManagementById(taskSampleRelation.getSampleId());
        AutomobileEnterprise automobileEnterprise = automobileEnterpriseMapper.selectAutomobileEnterpriseById(sample.getManufacturingEnterpriseId());

        carReviewTask.setEnterpriseName(automobileEnterprise.getEnterpriseName());

        // 构建返回结果
        CarReviewTaskViewResponse response = new CarReviewTaskViewResponse();
        response.setCarReviewTask(carReviewTask);
        response.setReviewSceneChangeTasks(lastChanges);

        return response;
    }

    @Override
    public void doStartReview(CarReviewTask carReviewTask) {
        throw new ServiceException("不能开始一个进行中的任务", HttpStatus.ERROR);
    }

    @Override
    public void doConfirmReview(CarReviewTask carReviewTask) {
        List<ReviewDetails> detailsList = reviewDetailsMapper.findNoResult(carReviewTask.getId(),CarReviewTask.TYPE,carReviewTask.getStandardId());
        List<ReviewTaskInbox> inboxList = reviewTaskInboxMapper.findConfirmListByTaskId(carReviewTask.getId());
        if (detailsList != null && detailsList.size() != 0) {
            throw new ServiceException("存在未填写的表单,请填写完整", HttpStatus.ERROR, detailsList);
        } else if (inboxList != null && inboxList.size() != 0){
            throw new ServiceException("存在未确认的场景变更信息,请确认", HttpStatus.ERROR);
        }else {
            // 1. 获取最新问卷
            List<ReviewStandard> standardTree = reviewStandardService.findTree(carReviewTask.getStandardId(), ReviewStandard.TYPE_CAR);

            // 2. 所有细则必须有对应答案
            List<ReviewDetailsResult> results = reviewDetailsResultService.findByTaskId(carReviewTask.getId());

            // 3. 将最终问卷归档到 standard 字段
            setDetailsResult(standardTree, results,carReviewTask);
            carReviewTask.setStandard(standardTree);

            // 4. 修改任务状态为 SIGNED 待签字
            carReviewTask.setTaskStatus(CarReviewTask.TASK_STATUS_SIGNED);

            // 5. 设置问卷结果
            if (reviewDetailsResultMapper.findNotPass(carReviewTask.getId()) > 0) {
                carReviewTask.setTaskResult("REJECT");
            } else {
                carReviewTask.setTaskResult("PASS");
            }

            // 6. 设置签字图片
            SysUser sysUser = sysUserService.selectUserById(carReviewTask.getLeaderId());
            carReviewTask.setImagesUrl(sysUser.getSignaturePicture());

            carReviewTaskMapper.updateById(carReviewTask);
        }
    }

    @Override
    public void doSubmitReview(CarReviewTask carReviewTask,String imagesUrl, List<Long> testScenarioList) {

        throw new ServiceException("不能提交一个未确认的任务", HttpStatus.ERROR);

    }

    private void setDetailsResult(List<ReviewStandard> standards, List<ReviewDetailsResult> results, CarReviewTask carReviewTask) {

        if (results != null && results.size() != 0) {
            // 小组成员姓名、部门
            List<UserNameResponse> userList = reviewDetailsResultMapper.findByResultList(results);

            for (UserNameResponse response : userList) {
                for (ReviewDetailsResult result : results) {
                    if (Objects.equals(result.getUserId(), response.getUserId())) {
                        result.setUserName(response.getName());
                    }
                }
            }

            reviewDetailsResultService.updateBatchById(results);
        }

        Map<Long, ReviewDetailsResult> resultMap = results.stream().collect(Collectors.toMap(ReviewDetailsResult::getReviewDetailsId, Function.identity(), (v1, v2) -> v1));

        for(ReviewStandard standard : standards) {
            standard.setPassed(ReviewStandard.PASSED);
            List<ReviewKeyPoint> keyPointList = standard.getKeyPointList();

            for(ReviewKeyPoint keypoint : keyPointList) {
                List<ReviewDetails> reviewDetailsList = keypoint.getReviewDetailsList();

                for(ReviewDetails details : reviewDetailsList) {
                    ReviewDetailsResult reviewDetailsResult = resultMap.get(details.getId());
                    if(reviewDetailsResult != null && Objects.equals(reviewDetailsResult.getPassed(), ReviewStandard.NO_PASSED)) {
                        standard.setPassed(ReviewStandard.NO_PASSED);
                    }
                    if(reviewDetailsResult == null) {
                        standard.setPassed(null);
                    }
                    if(reviewDetailsResult != null && reviewDetailsResult.getReviewEnterpriseArchiveId() != null) {

                        reviewDetailsResult.setFileList(setFileList(reviewDetailsResult));
                    }
                    details.setResult(reviewDetailsResult);
                }
            }
        }


        List<TaskUserRelation> relationList = taskUserRelationMapper.selectQTeamMembers(taskMapper.findByCarReviewTaskId(carReviewTask.getId()));

        carReviewTask.setStandards(DataStatisticsUtils.calculateStandards(standards));
        BigDecimal standardPass = new BigDecimal((calculateStandardsPass(standards, resultMap) / (double) carReviewTask.getStandards())*100);
        carReviewTask.setStandardsPass(standardPass.setScale(1,BigDecimal.ROUND_UP).doubleValue());
        carReviewTask.setDetails(DataStatisticsUtils.calculateDetails(standards));
        BigDecimal detailsPass = new BigDecimal((DataStatisticsUtils.calculateDetailsPass(standards, resultMap) / (double) carReviewTask.getDetails())*100);
        carReviewTask.setDetailsPass(detailsPass.setScale(1,BigDecimal.ROUND_UP).doubleValue());
        carReviewTask.setPerson(relationList.size());

        carReviewTaskMapper.updateById(carReviewTask);

    }

    // 设置文件列表
    private List<ReviewEnterpriseArchiveFileVO> setFileList(ReviewDetailsResult reviewDetailsResult) {
        // 拆分字段值,得到对应的数组
        String[] idArray = reviewDetailsResult.getReviewEnterpriseArchiveId().split(",");
        String[] catalogueArray = reviewDetailsResult.getCatalogue().split(",");
        String[] fileNameArray = reviewDetailsResult.getFileName().split(",");

        // 获取数组的最大长度
        int maxLength = Math.max(Math.max(idArray.length, catalogueArray.length), fileNameArray.length);

        // 创建列表,用于存储合成对象
        List<ReviewEnterpriseArchiveFileVO> fileList = new ArrayList<>();

        // 合成对象
        for (int i = 0; i < maxLength; i++) {
            Long id = (i < idArray.length && !idArray[i].isEmpty()) ? Long.parseLong(idArray[i]) : null;
            String catalogue = (i < catalogueArray.length) ? catalogueArray[i] : null;
            String fileName = (i < fileNameArray.length) ? fileNameArray[i] : null;

            ReviewEnterpriseArchiveFileVO fileVO = new ReviewEnterpriseArchiveFileVO();
            fileVO.setId(id);
            fileVO.setCatalogue(catalogue);
            fileVO.setFileName(fileName);

            fileList.add(fileVO);
        }

        return fileList;
    }


    @Override
    public void afterPropertiesSet() throws Exception {
        strategyCarReviewTaskContext.putResource(CarReviewTask.TASK_STATUS_PENDING, applicationContext.getBean(this.getClass()));
    }
}