package com.storlead.message.contract;

import java.util.Set;

/**
 * 消息域对<strong>外部业务域</strong>的对外契约（Port），本模块仅此一类 API。
 * <p>
 * 入参使用 {@link MessageVariables}、{@link RowIdentity} 等对象，不依赖消息实体、MyBatis；
 * 业务模块编译期只需依赖 {@code storlead-message-spi}。
 * </p>
 * <p>
 * 运行时请引入 {@code storlead-message-biz}，由
 * {@code com.storlead.message.contract.support.MessageEventPortImpl} 注册为 Spring Bean。
 * </p>
 */
public interface MessageEventPort {

    /**
     * 按模板服务编码匹配规则并异步发送（默认渠道：site、wecom、sms、mail）。
     */
    void fireDataChangeMessages(MessageVariables before, MessageVariables after, String templateServiceCode);

    /**
     * 按模板服务编码匹配规则并异步发送，可指定渠道参数（与站内实现约定一致）。
     */
    void fireDataChangeMessages(MessageVariables before, MessageVariables after, String templateServiceCode, String... channels);

    /**
     * 按服务类型 + 事件编码定位唯一模板并异步发送。
     */
    void fireByTemplateServiceTypeAndEvent(MessageVariables payload, String templateServiceType, String eventCode, Set<Long> toUserIds, String... args);

    /**
     * 根据表主键拉取变更前行数据，并转换为带 {@code before*} 前缀的扁平变量（供规则脚本使用）。
     * <p>无数据时返回 {@link MessageVariables#empty()}（非 {@code null}）。</p>
     */
    MessageVariables snapshotBeforeRow(RowIdentity row);
}
