package com.flowable.devops.workflow.model;

import lombok.Data;

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

/**
 * 节点输入参数模型
 * 
 * 封装节点执行时的输入参数，提供类型安全的访问方法
 */
@Data
public class NodeInput {
    
    private final Map<String, Object> parameters;
    
    public NodeInput(Map<String, Object> parameters) {
        this.parameters = parameters != null ? new HashMap<>(parameters) : new HashMap<>();
    }
    
    /**
     * 获取字符串参数
     */
    public String getString(String key) {
        Object value = parameters.get(key);
        return value != null ? value.toString() : null;
    }
    
    /**
     * 获取字符串参数（带默认值）
     */
    public String getString(String key, String defaultValue) {
        String value = getString(key);
        return value != null ? value : defaultValue;
    }
    
    /**
     * 获取必需的字符串参数
     */
    public String getStringRequired(String key) {
        String value = getString(key);
        if (value == null || value.trim().isEmpty()) {
            throw new IllegalArgumentException("Required parameter '" + key + "' is missing or empty");
        }
        return value;
    }
    
    /**
     * 获取整数参数
     */
    public Integer getInteger(String key) {
        Object value = parameters.get(key);
        if (value == null) {
            return null;
        }
        if (value instanceof Integer) {
            return (Integer) value;
        }
        if (value instanceof Number) {
            return ((Number) value).intValue();
        }
        try {
            return Integer.parseInt(value.toString());
        } catch (NumberFormatException e) {
            throw new IllegalArgumentException("Parameter '" + key + "' is not a valid integer: " + value);
        }
    }
    
    /**
     * 获取整数参数（带默认值）
     */
    public Integer getInteger(String key, Integer defaultValue) {
        Integer value = getInteger(key);
        return value != null ? value : defaultValue;
    }
    
    /**
     * 获取布尔参数
     */
    public Boolean getBoolean(String key) {
        Object value = parameters.get(key);
        if (value == null) {
            return null;
        }
        if (value instanceof Boolean) {
            return (Boolean) value;
        }
        return Boolean.parseBoolean(value.toString());
    }
    
    /**
     * 获取布尔参数（带默认值）
     */
    public Boolean getBoolean(String key, Boolean defaultValue) {
        Boolean value = getBoolean(key);
        return value != null ? value : defaultValue;
    }
    
    /**
     * 获取Map参数
     */
    @SuppressWarnings("unchecked")
    public Map<String, Object> getMap(String key) {
        Object value = parameters.get(key);
        if (value instanceof Map) {
            return (Map<String, Object>) value;
        }
        return null;
    }
    
    /**
     * 获取Map参数（带默认值）
     */
    public Map<String, Object> getMap(String key, Map<String, Object> defaultValue) {
        Map<String, Object> value = getMap(key);
        return value != null ? value : defaultValue;
    }
    
    /**
     * 获取List参数
     */
    @SuppressWarnings("unchecked")
    public List<Object> getList(String key) {
        Object value = parameters.get(key);
        if (value instanceof List) {
            return (List<Object>) value;
        }
        return null;
    }
    
    /**
     * 获取List参数（带默认值）
     */
    public List<Object> getList(String key, List<Object> defaultValue) {
        List<Object> value = getList(key);
        return value != null ? value : defaultValue;
    }
    
    /**
     * 获取原始参数值
     */
    public Object get(String key) {
        return parameters.get(key);
    }
    
    /**
     * 检查参数是否存在
     */
    public boolean contains(String key) {
        return parameters.containsKey(key);
    }
    
    /**
     * 获取所有参数键
     */
    public java.util.Set<String> keySet() {
        return parameters.keySet();
    }
    
    /**
     * 获取参数数量
     */
    public int size() {
        return parameters.size();
    }
    
    /**
     * 检查是否为空
     */
    public boolean isEmpty() {
        return parameters.isEmpty();
    }
    
    /**
     * 转换为Map
     */
    public Map<String, Object> toMap() {
        return new HashMap<>(parameters);
    }
}