package com.wms_main.service.quartz_job.job_executor;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.wms_main.constant.enums.wcs.WcsApiResponseCodeEnums;
import com.wms_main.constant.enums.wcs.WcsStackerTaskStatusEnums;
import com.wms_main.constant.enums.wms.WmsStackerTaskStatusEnums;
import com.wms_main.dao.ITAppTaskService;
import com.wms_main.dao.ITAppWcsTaskService;
import com.wms_main.model.bo.wcs.WcsStackerTask;
import com.wms_main.model.dto.request.wcs.WcsStackerTaskRequest;
import com.wms_main.model.dto.response.wcs.WcsApiResponse;
import com.wms_main.model.po.TAppTask;
import com.wms_main.model.po.TAppWcsTask;
import com.wms_main.repository.utils.StringUtils;
import com.wms_main.service.api.IWcsApiService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.quartz.*;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 定时任务定义类---发送堆垛机任务
 */
@Slf4j
@PersistJobDataAfterExecution
// 以下注解用于实现fixed_delay
@DisallowConcurrentExecution
@RequiredArgsConstructor
public class WcsStackerTaskSender implements Job {
    /**
     * Wcs任务服务
     */
    private final ITAppWcsTaskService appWcsTaskService;
    /**
     * Wms任务服务
     */
    private final ITAppTaskService appTaskService;
    /**
     * Wcs接口服务
     */
    private final IWcsApiService wcsApiService;

    /**
     * 运行定时任务
     * 向Wcs发送堆垛机任务
     *
     * @param jobExecutionContext 定时任务执行的环境（上下文）
     */
    @Override
    public void execute(JobExecutionContext jobExecutionContext) {
        // 查询到所有的待下发的wcsTask
        List<TAppWcsTask> waitSendWcsTaskList = appWcsTaskService.list(
                new LambdaQueryWrapper<TAppWcsTask>()
                        .eq(TAppWcsTask::getWcsTaskStatus, WcsStackerTaskStatusEnums.INIT.getCode())
        );
        // 发送任务
        for (TAppWcsTask wcsTask : waitSendWcsTaskList) {
            // 生成请求
            WcsStackerTaskRequest request = new WcsStackerTaskRequest(
                    wcsTask.getWcsTaskId(),
                    wcsTask.getWcsTaskType(),
                    wcsTask.getTaskPriority(),
                    wcsTask.getOrigin(),
                    wcsTask.getDestination(),
                    wcsTask.getVehicleId()
            );
            try {
                WcsApiResponse<WcsStackerTask> wcsResponse = wcsApiService.sendWcsStackerTask(request);
                if (wcsResponse != null && WcsApiResponseCodeEnums.SUCCESS.getCode() == wcsResponse.getCode()) {
                    // 更新当前的wcs任务状态为已发送
                    appWcsTaskService.update(
                            new LambdaUpdateWrapper<TAppWcsTask>()
                                    .set(TAppWcsTask::getWcsTaskStatus, WcsStackerTaskStatusEnums.WAIT.getCode())
                                    .set(TAppWcsTask::getSendTime, LocalDateTime.now())
                                    .eq(TAppWcsTask::getWcsTaskId, wcsTask.getWcsTaskId())
                    );
                    // 更新当前wcs任务对应的wms任务为已发送
                    appTaskService.update(
                            new LambdaUpdateWrapper<TAppTask>()
                                    .set(TAppTask::getTaskStatus, WmsStackerTaskStatusEnums.SEND.getCode())
                                    .eq(TAppTask::getWcsTaskId, wcsTask.getWcsTaskId())
                    );
                } else {
                    log.error("堆垛机任务发送失败，请求{}，响应信息{}。", StringUtils.objectToString(request), StringUtils.objectToString(wcsResponse));
                    // 更新当前的wcs任务状态为异常
                    appWcsTaskService.update(
                            new LambdaUpdateWrapper<TAppWcsTask>()
                                    .set(TAppWcsTask::getWcsTaskStatus, WcsStackerTaskStatusEnums.EXCEPTION.getCode())
                                    .set(TAppWcsTask::getSendTime, LocalDateTime.now())
                                    .eq(TAppWcsTask::getWcsTaskId, wcsTask.getWcsTaskId())
                    );
                    // 更新当前wcs任务对应的wms任务为异常
                    appTaskService.update(
                            new LambdaUpdateWrapper<TAppTask>()
                                    .set(TAppTask::getTaskStatus, WmsStackerTaskStatusEnums.EXCEPTION.getCode())
                                    .eq(TAppTask::getWcsTaskId, wcsTask.getWcsTaskId())
                    );
                }
            } catch (Exception e) {
                log.error("堆垛机任务发送失败，任务号：{}，载具号：{}，起点：{}，终点：{}。", request.getTaskId(), request.getVehicleNo(), request.getOrigin(), request.getDestination());
            }
        }
    }
}
