package com.zcloud.safetyDutyList.command.tasklist;

import com.zcloud.safetyDutyList.domain.enums.TaskStatusEnum;
import com.zcloud.safetyDutyList.domain.gateway.tasklist.TaskDetailGateway;
import com.zcloud.safetyDutyList.domain.gateway.tasklist.TaskListGateway;
import com.zcloud.safetyDutyList.domain.model.tasklist.TaskDetailE;
import com.zcloud.safetyDutyList.domain.model.tasklist.TaskListE;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 清单状态更新执行器
 * <p>
 * 处理定时任务1的业务逻辑：更新过期清单和任务状态。
 * <p>
 * 处理流程：
 *   1. 查询所有状态为进行中(status=1)且周期结束时间(period_end_time)小于当前时间的清单
 *   2. 将这些清单的状态从进行中(1)更新为已完成(2)
 *   3. 遍历每个已过期的清单，查询其下所有任务详情
 *   4. 将任务状态为进行中(task_status=1)的任务更新为已完成(task_status=2)
 * <p>
 * 事务控制：整个更新过程在同一事务中执行，确保清单状态和任务状态的一致性
 */
@Slf4j
@Component
@AllArgsConstructor
public class TaskListStatusUpdateExe {

    /** 清单网关，用于查询和更新清单数据 */
    private final TaskListGateway taskListGateway;

    /** 任务详情网关，用于查询和更新任务数据 */
    private final TaskDetailGateway taskDetailGateway;

    /**
     * 执行过期清单状态更新
     * <p>
     * 查询所有已过期且仍在进行中的清单，将其状态更新为已完成，
     * 同时将该清单下所有进行中的任务也标记为已完成。
     */
    @Transactional(rollbackFor = Exception.class)
    public void execute() {
        // 步骤1：查询所有状态为进行中(status=1)且周期结束时间(period_end_time)小于当前时间的清单
        List<TaskListE> expiredList = taskListGateway.listExpiredInProgress();
        if (expiredList == null || expiredList.isEmpty()) {
            log.info("【定时任务-安全责任清单-检测任务完成】没有需要更新的过期清单");
            return;
        }

        log.info("【定时任务-安全责任清单-检测任务完成】查询到{}条过期清单需要更新状态", expiredList.size());

        for (TaskListE taskListE : expiredList) {
            // 步骤2：将清单状态从进行中(1)更新为已完成(2)
            taskListE.setStatus(TaskStatusEnum.COMPLETED.getCode());
            taskListGateway.update(taskListE);
            log.info("【定时任务-安全责任清单-检测任务完成】清单[{}]状态已更新为已完成", taskListE.getTaskListId());

            // 步骤3：查询该清单下所有任务详情，将进行中的任务更新为已完成
            List<TaskDetailE> detailList = taskDetailGateway.listByTaskListId(taskListE.getTaskListId());
            if (detailList != null) {
                for (TaskDetailE detailE : detailList) {
                    // 仅更新状态为进行中(task_status=1)的任务
                    if (TaskStatusEnum.IN_PROGRESS.getCode().equals(detailE.getTaskStatus())) {
                        detailE.setTaskStatus(TaskStatusEnum.COMPLETED.getCode());
                        taskDetailGateway.update(detailE);
                        log.info("【定时任务-安全责任清单-检测任务完成】任务[{}]状态已更新为已完成", detailE.getTaskDetailId());
                    }
                }
            }
        }
    }
}
