package com.ruoyi.service.impl;

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.CarReviewTaskMapper;
import com.ruoyi.mapper.ReviewDetailsMapper;
import com.ruoyi.mapper.ReviewDetailsResultMapper;
import com.ruoyi.mapper.TaskMapper;
import com.ruoyi.service.ReviewDetailsResultService;
import com.ruoyi.service.ReviewSceneChangeTaskService;
import com.ruoyi.service.ReviewStandardService;
import com.ruoyi.service.StrategyCarReviewTask;
import com.ruoyi.web.response.CarReviewTaskViewResponse;
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 javax.swing.table.TableModel;
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 StrategyCarReviewTaskSigned implements StrategyCarReviewTask, InitializingBean {

    @Autowired
    private StrategyCarReviewTaskContext strategyCarReviewTaskContext;

    @Autowired
    private ApplicationContext applicationContext;

    @Autowired
    private CarReviewTaskMapper carReviewTaskMapper;

    @Autowired
    private TaskMapper taskMapper;

    @Autowired
    private TaskStateFacade taskStateFacade;

    // SIGNED状态下
    // 1.standard字段使用task中归档的问卷
    // 2.不查询场景变更任务
    // 3.无需联查问卷答案
    @Override
    public CarReviewTaskViewResponse doView(CarReviewTask carReviewTask) {
        CarReviewTaskViewResponse response = new CarReviewTaskViewResponse();
        response.setCarReviewTask(carReviewTask);
        return response;
    }

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

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

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

        // 1. 填充review_submit_time
        carReviewTask.setTaskEndTime(new Date());

        // 2. 修改任务状态为 FINISH
        carReviewTask.setTaskStatus(CarReviewTask.TASK_STATUS_FINISH);

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

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

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

        carReviewTaskMapper.updateById(carReviewTask);
        taskMapper.updateById(task);

    }


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