package com.cmvr.test.flow.context;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjUtil;
import com.alibaba.fastjson2.JSONObject;
import com.cmvr.test.enums.RunModeEnum;
import com.cmvr.test.enums.TaskStatusEnum;
import com.cmvr.test.enums.TerminalStatusEnum;
import com.cmvr.test.flow.builder.TaskKeyBuilder;
import lombok.Data;

import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 任务执行上下文，用于保存任务运行状态、控制标志等信息。
 */
@Data
public class TaskContext {

    /**
     * 任务实例 ID
     */
    private String instId;

    /**
     * 任务 ID
     */
    private String taskId;

    /**
     * 当前检测项 ID
     */
    private String itemId;

    /**
     * 所属终端 ID
     */
    private String terminalId;

    /**
     * 当前运行状态（运行中/已完成/失败/暂停/终止）
     */
    private TaskStatusEnum status;

    /**
     * 运行模式：NORMAL（正常） / TRIAL（试运行）
     */
    private RunModeEnum runMode;

    /**
     * 当前终端状态
     */
    private TerminalStatusEnum terminalStatus;

    /**
     * 是否处于暂停中
     */
    private volatile boolean paused = false;

    /**
     * 是否已被强行终止
     */
    private volatile boolean stopped = false;

    /**
     * 是否锁定终端（标识该终端是否被占用）
     */
    private volatile boolean terminalLocked = false;

    /**
     * 存储节点输出参数
     * key = nodeId@iterationPath，例如 "nodeA@0.1.2"
     */
    private final Map<String, JSONObject> nodeOutputs = new ConcurrentHashMap<>();

    /**
     * 存储节点输入参数（暂时覆盖存入）
     */
    private final Map<String, JSONObject> nodeInputs = new ConcurrentHashMap<>();

    /**
     * 运行任务时的初始参数
     */
    private JSONObject runParams = new JSONObject();

    /**
     * 上次更新时间
     */
    private Date updatedAt;

    /**
     * 上下文创建时间
     */
    private Date createdAt;

    public TaskContext() {
        this.createdAt = new Date();
        this.updatedAt = this.createdAt;
    }

    /**
     * 更新上下文的更新时间戳
     */
    public void updateTimestamp() {
        this.updatedAt = new Date();
    }

    /**
     * 保存节点输出
     */
    public void setNodeOutput(String nodeId, List<Integer> iterations, JSONObject outputParams) {
        String key = TaskKeyBuilder.buildKey(nodeId, iterations);
        nodeOutputs.put(key, outputParams != null ? outputParams : new JSONObject());
        updateTimestamp();
    }

    /**
     * 获取节点输出
     */
    public JSONObject getNodeOutput(String nodeId, List<Integer> iterations) {
        if (CollUtil.isEmpty(iterations)) {
            return nodeOutputs.get(TaskKeyBuilder.buildKey(nodeId, Collections.emptyList()));
        }

        // 从完整 iterations 开始逐级回退
        for (int i = iterations.size(); i >= 0; i--) {
            List<Integer> subIterations = iterations.subList(0, i);
            String key = TaskKeyBuilder.buildKey(nodeId, subIterations);

            JSONObject result = nodeOutputs.get(key);
            if (ObjUtil.isNotEmpty(result)) {
                return result;
            }
        }

        return null;
    }

    /**
     * 保存节点输入
     */
    public void setNodeInput(String nodeId, JSONObject outputParams) {
        nodeOutputs.put(nodeId, outputParams != null ? outputParams : new JSONObject());
        updateTimestamp();
    }
}
