package com.storlead.message.contract;

import java.io.Serializable;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Objects;
import java.util.function.BiConsumer;

/**
 * 模板规则 / 消息发送使用的<strong>变量集合</strong>（键值对），不暴露为 {@code Map} 形态给调用方，
 * 由 {@link MessageEventPort} 入参使用；消息域内部会转为 Map 供规则引擎与模板替换使用。
 */
public final class MessageVariables implements Serializable {

    private static final long serialVersionUID = 1L;

    private final LinkedHashMap<String, Object> entries = new LinkedHashMap<>();

    public static MessageVariables empty() {
        return new MessageVariables();
    }

    /**
     * 从已有 Map 拷贝一份（防御性拷贝），便于与遗留 Map 数据对接。
     */
    public static MessageVariables fromMap(Map<String, ?> source) {
        MessageVariables v = new MessageVariables();
        if (source != null) {
            source.forEach((k, val) -> {
                if (k != null) {
                    v.entries.put(k, val);
                }
            });
        }
        return v;
    }

    public MessageVariables put(String name, Object value) {
        if (name != null) {
            entries.put(name, value);
        }
        return this;
    }

    public Object get(String name) {
        return entries.get(name);
    }

    public boolean contains(String name) {
        return entries.containsKey(name);
    }

    public boolean isEmpty() {
        return entries.isEmpty();
    }

    public int size() {
        return entries.size();
    }

    /**
     * 遍历所有变量（供消息域实现转换为引擎入参）。
     */
    public void forEach(BiConsumer<String, Object> consumer) {
        Objects.requireNonNull(consumer, "consumer");
        entries.forEach(consumer);
    }
}
