package cn.axzo.msg.center.api.request;

import cn.axzo.msg.center.api.enums.MsgTypeEnum;
import cn.axzo.msg.center.api.enums.ReceiveTypeEnum;
import cn.axzo.msg.center.api.identity.ExecutionExceptionHandler;
import lombok.Data;
import lombok.experimental.Accessors;

import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * 推送消息的基础抽象
 * <p>
 * 后续可被用于扩展不同类型消息,比如图片,音视频,卡片等自定义类型
 *
 * @author: wangli
 * @date: 2022/3/18 13:44
 */
@Data
@Accessors(chain = true)
public abstract class AbstractMessage {

  /**
   * 发送方 ID
   */
  private Long fromId = 0L;

  /**
   * 接收方 ID
   * <p>
   * (e.g. 项目公告,接收者是集合)
   */
  @NotNull(message = "接收者不能为空")
  @NotEmpty(message = "接收者不能为空")
  private Set<Long> toId;

  /**
   * 消息类型(普通/待办)
   */
  private MsgTypeEnum type = MsgTypeEnum.GENERAL_MESSAGE;

  /**
   * 能确定唯一消息的模块和模板的标识.
   * <p>
   * 如果是新消息内容, 需要联系消息中心进行模板注册, 注册后会返回对应 relationId.<br/> 如果是已有的消息内容, 也建议先联系消息中心获取最新的 relationId,
   * 而不是传原始的 TypeId.
   */
  @NotNull(message = "模板id不能为空")
  private Long relationId;

  /**
   * 模板内需替换的参数
   */
  private Map<String, String> msgParams = new HashMap<>();

  /**
   * 路由参数, 一般情况下不需要传
   */
  private Map<String, String> routerParams = new HashMap<>();

  /**
   * 扩展业务相关参数
   * <p>
   * 注意: 必须是 JSON 格式
   */
  private String ext = "{}";

  /**
   * 本地异常执行回调处理器
   */
  private ExecutionExceptionHandler localHandler;

  /**
   * 远端异常执行回调地址
   */
  private String callbackUrl;

  /**
   * 将扩展属性的 Get 方法提升到抽象类,便于使用
   * @return
   */
  public abstract ReceiveTypeEnum getReceiveType();

}
