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.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.domain.*;
import com.ruoyi.mapper.*;
import com.ruoyi.service.ReviewDetailsResultService;
import com.ruoyi.service.ReviewSceneChangeTaskService;
import com.ruoyi.service.ReviewStandardService;
import com.ruoyi.service.StrategySystemReviewTask;
import com.ruoyi.web.response.DataStatisticsResponse;
import com.ruoyi.web.response.SystemReviewTaskViewResponse;
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.Date;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

@Transactional
@Service
public class StrategySystemReviewTaskSigned implements StrategySystemReviewTask, InitializingBean {

    @Autowired
    private StrategySystemReviewTaskContext strategySystemReviewTaskContext;

    @Autowired
    private ApplicationContext applicationContext;

    @Autowired
    private SystemReviewTaskMapper systemReviewTaskMapper;

    @Autowired
    private TaskMapper taskMapper;

    @Autowired
    private TaskStateFacade taskStateFacade;

    @Autowired
    private ReviewStandardService reviewStandardService;

    @Autowired
    private ReviewDetailsResultService reviewDetailsResultService;

    @Autowired
    private TaskUserRelationMapper taskUserRelationMapper;


    @Override
    public void doStart(SystemReviewTask systemReviewTask) {
        throw new ServiceException("不能开始一个已确认的任务", HttpStatus.ERROR);
    }

    @Override
    public void doConfirm(SystemReviewTask systemReviewTask) {
        throw new ServiceException("不能确认一个已确认的任务", HttpStatus.ERROR);
    }

    @Override
    public void doSubmit(SystemReviewTask systemReviewTask, List<String> imagesUrl) {

        // 1. 填充task_end_time
        systemReviewTask.setTaskEndTime(new Date());

        // 2. 修改任务状态为 FINISH
        systemReviewTask.setTaskStatus(SystemReviewTask.STATUS_FINISH);

        // 3. 填写当前用户id
        // 获取当前登陆人
        SysUser loginUser = SecurityUtils.getLoginUser().getUser();
        systemReviewTask.setSubmitById(loginUser.getUserId());
        systemReviewTask.setSubmitByName(loginUser.getNickName());

        // 4.保存签名图片地址
        String joinImageUrl = StringUtils.join(imagesUrl,",");
        systemReviewTask.setImagesUrl(joinImageUrl);

        // 5.再找带该子任务所属的总任务,将总任务的状态由 RUNNING 改回 RUNNABLE
        Task task = taskMapper.selectById(taskMapper.findBySystemReviewTaskId(systemReviewTask.getId()));
        taskStateFacade.doSubmit(task);

        systemReviewTaskMapper.updateById(systemReviewTask);
        taskMapper.updateById(task);
    }

    @Override
    public void doClose(SystemReviewTask systemReviewTask) {
        throw new ServiceException("不能关闭一个已确认的任务", HttpStatus.ERROR);
    }

    // SIGNED状态下
    // 1.standard字段使用task中归档的问卷
    // 2.不查询场景变更任务
    // 3.无需联查问卷答案
    @Override
    public SystemReviewTaskViewResponse doView(SystemReviewTask systemReviewTask) {
        SystemReviewTaskViewResponse response = new SystemReviewTaskViewResponse();
        systemReviewTask.setImagesUrl("/vehicle-quality-review-oss/2024/03/04/qianzi1_20240304104011A001.jpg,/vehicle-quality-review-oss/2024/03/04/qianzi2_20240304104121A002.jpg");

        // 获取问卷
        List<ReviewStandard> standardTree = reviewStandardService.findTree(systemReviewTask.getStandardId(), ReviewStandard.TYPE_SYSTEM);

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

        // 体系审查
        setSystemDataStatistics(standardTree,results,systemReviewTask);

        response.setSystemReviewTask(systemReviewTask);

        return response;
    }

    private void setSystemDataStatistics(List<ReviewStandard> standards, List<ReviewDetailsResult> results, SystemReviewTask systemReviewTask) {
        Map<Long, ReviewDetailsResult> resultMap = results.stream().collect(Collectors.toMap(ReviewDetailsResult::getReviewDetailsId, Function.identity(), (v1, v2) -> v1));

        List<TaskUserRelation> relationList = taskUserRelationMapper.selectQTeamMembers(taskMapper.findBySystemReviewTaskId(systemReviewTask.getId()));

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

    }

    @Override
    public void afterPropertiesSet() throws Exception {
        strategySystemReviewTaskContext.putResource(SystemReviewTask.STATUS_SIGNED, applicationContext.getBean(this.getClass()));
    }
}