package com.ruoyi.ems.domain;

import lombok.Data;

import java.util.HashMap;
import java.util.Map;

/**
 * 策略执行上下文
 * 存储执行过程中的变量、步骤结果等信息
 */
@Data
public class StrategyExecutionContext {

    /**
     * 执行ID
     */
    private String execId;

    /**
     * 策略代码
     */
    private String strategyCode;

    /**
     * 开始时间戳
     */
    private long startTime;

    /**
     * 触发类型
     */
    private String triggerType;

    /**
     * 触发源
     */
    private String triggerSource;

    /**
     * 执行人
     */
    private String execBy;

    /**
     * 上下文变量
     */
    private Map<String, Object> variables = new HashMap<>();

    /**
     * 步骤执行结果
     */
    private Map<String, Object> stepResults = new HashMap<>();

    /**
     * 获取触发类型
     * 优先从专用字段获取，其次从 variables 中获取
     */
    public String getTriggerType() {
        if (this.triggerType != null && !this.triggerType.isEmpty()) {
            return this.triggerType;
        }
        Object value = variables.get("trigger_type");
        return value != null ? value.toString() : null;
    }

    /**
     * 获取触发源
     * 优先从专用字段获取，其次从 variables 中获取
     */
    public String getTriggerSource() {
        if (this.triggerSource != null && !this.triggerSource.isEmpty()) {
            return this.triggerSource;
        }
        Object value = variables.get("trigger_source");
        return value != null ? value.toString() : null;
    }

    /**
     * 获取执行人
     * 优先从专用字段获取，其次从 variables 中获取
     */
    public String getExecBy() {
        if (this.execBy != null && !this.execBy.isEmpty()) {
            return this.execBy;
        }
        Object value = variables.get("exec_by");
        return value != null ? value.toString() : null;
    }

    /**
     * 设置变量
     */
    public void setVariable(String key, Object value) {
        this.variables.put(key, value);
    }

    /**
     * 获取变量
     */
    public Object getVariable(String key) {
        return this.variables.get(key);
    }

    /**
     * 设置步骤结果
     */
    public void setStepResult(String stepCode, Object result) {
        this.stepResults.put(stepCode, result);
    }

    /**
     * 获取步骤结果
     */
    public Object getStepResult(String stepCode) {
        return this.stepResults.get(stepCode);
    }
}