package cn.axzo.msg.center.service.pending.request;

import cn.axzo.msg.center.service.dto.PeerPerson;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.Getter;
import lombok.Setter;

import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.HashSet;
import java.util.Set;

/**
 * @author yanglin
 */
@Setter
@Getter
public class CardSendRequest implements CardContent {

    /**
     * 调用方应用编码或场景编码, 保证这个场景下bizCode唯一
     */
    @NotBlank(message = "应用编码不能为空")
    private String appCode;

    /**
     * 模版编码
     */
    @NotBlank(message = "模版编码不能为空")
    private String templateCode;

    /**
     * 业务编码
     */
    @NotBlank(message = "业务编码不能为空")
    private String bizCode;

    /**
     * 子业务编码
     */
    private String subBizCode;

    /**
     * 发送人
     */
    @NotNull(message = "发送人不能为空")
    private PeerPerson sender = PeerPerson.nonPerson();

    /**
     * 接收人
     */
    @NotEmpty(message = "接收人不能为空")
    private Set<PeerPerson> receivers = new HashSet<>();

    /**
     * 业务参数
     */
    private JSONObject bizParam = new JSONObject();

    /**
     * 路由参数
     */
    private JSONObject routerParam = new JSONObject();

    /**
     * 副标题
     */
    private String subtitle;

    /**
     * 是否返回卡片信息. 默认不返回
     */
    private boolean returnCards = false;

    /**
     * 状态信息
     */
    @Valid
    @NotNull(message = "状态不能为空")
    private CardStateInfo stateInfo;

    @Override
    public boolean isButtonActionPerformed(String buttonCode) {
        return false;
    }

    @Override
    public JSONObject getBizParam() {
        return bizParam == null ? new JSONObject() : bizParam;
    }

    @Override
    public JSONObject getRouterParam() {
        return routerParam == null ? new JSONObject() : routerParam;
    }

    public String determineBizCode() {
        return bizCode == null ? "" : bizCode;
    }

    @Override
    public String toString() {
        return JSON.toJSONString(this);
    }
}