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.mapper.SystemReviewTaskMapper;
import com.ruoyi.service.*;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.web.request.SystemReviewTaskConfirmRequest;
import com.ruoyi.web.request.SystemReviewTaskCreateRequest;
import com.ruoyi.web.request.SystemReviewTaskStartRequest;
import com.ruoyi.web.request.SystemReviewTaskSubmitRequest;
import com.ruoyi.web.response.SystemReviewTaskViewResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;

/**
* @author wangfei
* @description 针对表【t_system_review_task(体系审查任务)】的数据库操作Service实现
* @createDate 2023-12-15 09:56:07
*/
@Transactional
@Service
public class SystemReviewTaskServiceImpl extends ServiceImpl<SystemReviewTaskMapper, SystemReviewTask> implements SystemReviewTaskService {

    @Autowired
    private TaskUserRelationService systemReviewTaskUserRelationService;

    @Autowired
    private SystemReviewTaskService systemReviewTaskService;

    @Autowired
    private StrategySystemReviewTaskContext strategySystemReviewTaskContext;

    @Autowired
    private SystemReviewTaskMapper systemReviewTaskMapper;

    @Autowired
    private ISysUserService sysUserService;

    @Autowired
    private StandardService standardService;

    @Autowired
    private ReviewDetailsMapper reviewDetailsMapper;


    @Override
    public void createTaskTest(SystemReviewTaskCreateRequest 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;
            }
        }

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

        systemReviewTaskService.save(task);


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

    @Override
    public SystemReviewTaskViewResponse view(Long taskId) {
        SystemReviewTask systemReviewTask = systemReviewTaskService.getById(taskId);
        return strategySystemReviewTaskContext.getResource(systemReviewTask.getTaskStatus()).doView(systemReviewTask);
    }

    @Override
    public void start(SystemReviewTaskStartRequest request) {
        start(request.getTaskId());
    }

    @Override
    public void start(Long id) {
        SystemReviewTask systemReviewTask = systemReviewTaskService.getById(id);
        strategySystemReviewTaskContext.getResource(systemReviewTask.getTaskStatus()).doStart(systemReviewTask);
    }

    @Override
    public List<SystemReviewTask> findListByStatus(String status) {
        return systemReviewTaskMapper.findListByStatus(status);
    }

    @Override
    public List<SystemReviewTask> findListInProcess() {
        return systemReviewTaskMapper.findListInProcess();
    }

    @Override
    public void confirm(SystemReviewTaskConfirmRequest request) {
        SystemReviewTask systemReviewTask = systemReviewTaskService.getById(request.getTaskId());
        strategySystemReviewTaskContext.getResource(systemReviewTask.getTaskStatus()).doConfirm(systemReviewTask);
    }

    @Override
    public void submit(SystemReviewTaskSubmitRequest request) {
        SystemReviewTask systemReviewTask = systemReviewTaskService.getById(request.getTaskId());
        strategySystemReviewTaskContext.getResource(systemReviewTask.getTaskStatus()).doSubmit(systemReviewTask,request.getImagesUrl());
    }

}