package cn.axzo.msg.center.service.dto;

import cn.axzo.framework.domain.ServiceException;
import cn.axzo.msg.center.service.domain.UrlConfig;
import cn.axzo.msg.center.service.enums.ButtonStyleEnum;
import cn.axzo.msg.center.service.enums.PresetButtonType;
import cn.axzo.msg.center.service.enums.RouterButtonSourceEnum;
import cn.axzo.msg.center.service.enums.RouterCategoryEnum;
import com.alibaba.fastjson.JSON;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.io.Serializable;
import java.util.List;

/**
 * @author cold_blade
 * @version 1.0
 * @description
 * @date 2023/9/23
 */
@Setter
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MessageTemplateButtonV3DTO implements Serializable {

    private static final long serialVersionUID = -9083376003614521781L;

    /**
     * 预设按钮类型
     */
    private PresetButtonType presetBtnType;

    /**
     * 按钮来源
     * SYSTEM: 系统
     * CUSTOM: 自定义
     */
    private RouterButtonSourceEnum source;

    /**
     * 路由分类
     * JUMP: 直接跳转
     * ACTION: 接口调用
     * PRESET_BUTTON: 预设按钮
     */
    private RouterCategoryEnum category;

    /**
     * 路由按钮的跳转url配置
     */
    private UrlConfig urlConfig;

    /**
     * 按钮样式配置
     * HIGH_LIGHT: 按钮高亮展示
     * OVER_CARD: 按钮显示在卡片上
     */
    private List<ButtonStyleEnum> style;

    /**
     * 执行人可见：true 不可见：false
     */
    private Boolean executorShow;

    /**
     * 待办状态可见可见：true 不可见：false
     */
    private Boolean pendingShow;

    /**
     * 按钮优先级，数值越大优先级越低
     */
    private Integer priority;

    /**
     * 按钮名称
     */
    private String name;

    /**
     * 按钮动作完成名称(失效名称)
     */
    private String actionPerformedName;

    /**
     * 标识
     */
    private String identityCode;

    /**
     * 后端标识
     */
    private String btnCode;

    /**
     * API地址,仅当按钮是接口调用类型时有值
     */
    private String apiUrl;

    /**
     * 操作者的自然人id
     */
    private Long createPersonId;
    /**
     * 操作人人姓名
     */
    private String createPersonName;

    /**
     * 更新人id
     */
    private Long updatePersonId;
    /**
     * 更新人姓名
     */
    private String updatePersonName;

    /**
     * <p>要改2处都要记得改
     */
    public void validate() {
        if (RouterCategoryEnum.PRESET_BUTTON.equals(category)) {
            if (presetBtnType == null) throw new ServiceException("预设按钮类型不能为空");
        } else if (RouterCategoryEnum.ACTION.equals(category)) {
            if (apiUrl == null) throw new ServiceException("接口调用地址不能为空");
        } else if (RouterCategoryEnum.JUMP.equals(category)) {
            if (urlConfig == null) throw new ServiceException("跳转地址不能为空");
            if (!urlConfig.hasUrl()) throw new ServiceException("跳转地址不能为空");
        }
    }

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