package com.ruoyi.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.SnowflakeUtil;
import com.ruoyi.domain.*;
import com.ruoyi.mapper.ReviewDetailsMapper;
import com.ruoyi.service.CarReviewTaskService;
import com.ruoyi.mapper.CarReviewTaskMapper;
import com.ruoyi.service.TaskUserRelationService;
import com.ruoyi.service.StandardService;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.web.request.CarReviewTaskConfirmRequest;
import com.ruoyi.web.request.CarReviewTaskCreateRequest;
import com.ruoyi.web.request.CarReviewTaskStartRequest;
import com.ruoyi.web.request.CarReviewTaskSubmitRequest;
import com.ruoyi.web.response.CarReviewTaskViewResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;

/**
* @author wangfei
* @description 针对表【t_car_review_task(车型审查任务)】的数据库操作Service实现
* @createDate 2024-01-08 13:14:13
*/
@Transactional
@Service
public class CarReviewTaskServiceImpl extends ServiceImpl<CarReviewTaskMapper, CarReviewTask>
    implements CarReviewTaskService{

    @Autowired
    private CarReviewTaskMapper carReviewTaskMapper;

    @Autowired
    private ISysUserService sysUserService;

    @Autowired
    private StandardService standardService;

    @Autowired
    private CarReviewTaskService carReviewTaskService;

    @Autowired
    private TaskUserRelationService relationService;

    @Autowired
    private StrategyCarReviewTaskContext strategyCarReviewTaskContext;

    @Autowired
    private ReviewDetailsMapper reviewDetailsMapper;

    @Override
    public List<CarReviewTask> findListByReviewStatus(String reviewStatus) {
        return carReviewTaskMapper.findListByReviewStatus(reviewStatus);
    }

    @Override
    public void createTask(CarReviewTaskCreateRequest request) {

        // 构建任务创建者
        LoginUser loginUser = SecurityUtils.getLoginUser();
        SysUser initiator = sysUserService.selectUserById(loginUser.getUserId());
        Standard standard = standardService.findListById(request.getStandardId());

        // 找到审查组长
        TaskUserRelation leader = null;
        List<TaskUserRelation> auditors = request.getAuditors();
        for(TaskUserRelation auditor : auditors) {
            if(auditor.getIsLeader() == 1) {
                leader = auditor;
                break;
            }
        }

        // 构建并保存任务信息
        CarReviewTask task = new CarReviewTask()
                .setTaskNo(SnowflakeUtil.generate().toString())
                .setTaskInitiator(initiator.getNickName())
                .setTaskInitiatorDept(initiator.getDept().getDeptName())
                .setTaskStatus(CarReviewTask.TASK_STATUS_NEW)
                .setLeaderId(leader.getUserId())
                .setLeader(leader.getName())
                .setCreateTime(new Date())
                .setStandardId(standard.getId())
                .setName(standard.getName())
                .setStandardNo(standard.getStandardNo())
                .setFile(standard.getFile());
        if (request.getReview()) {
            task.setTaskStatus(CarReviewTask.TASK_STATUS_NEW);
        }

        carReviewTaskService.save(task);


        // 构建并保存该任务所关联的审核组信息
        for(TaskUserRelation auditor : auditors) {
            auditor.setTaskId(task.getId());
        }
        relationService.saveBatch(auditors);
    }

    @Override
    public CarReviewTaskViewResponse viewReviewTask(Long taskId) {
        CarReviewTask carReviewTask = carReviewTaskService.getById(taskId);
        return strategyCarReviewTaskContext.getResource(carReviewTask.getTaskStatus()).doView(carReviewTask);
    }

    @Override
    public void startReviewTask(CarReviewTaskStartRequest request) {
        startReviewTask(request.getTaskId());
    }

    @Override
    public void startReviewTask(Long id) {
        CarReviewTask carReviewTask = carReviewTaskService.getById(id);
        strategyCarReviewTaskContext.getResource(carReviewTask.getTaskStatus()).doStartReview(carReviewTask);
    }

    @Override
    public void confirmReviewTask(CarReviewTaskConfirmRequest request) {

        CarReviewTask carReviewTask = carReviewTaskService.getById(request.getTaskId());
        strategyCarReviewTaskContext.getResource(carReviewTask.getTaskStatus()).doConfirmReview(carReviewTask);
    }

    @Override
    public void submitReviewTask(CarReviewTaskSubmitRequest request) {

        CarReviewTask carReviewTask = carReviewTaskService.getById(request.getTaskId());
        strategyCarReviewTaskContext.getResource(carReviewTask.getTaskStatus()).doSubmitReview(carReviewTask,request.getImagesUrl());
    }

    @Override
    public List<CarReviewTask> findListByStatus(String status) {
        return carReviewTaskMapper.findListByTaskStatus(status);
    }

}