package cn.axzo.workflow.starter;

import cn.axzo.workflow.starter.common.enums.FailHandleTypeEnum;

import java.util.HashSet;
import java.util.Set;

import static cn.axzo.workflow.starter.common.enums.FailHandleTypeEnum.FAIL_OVER;

/**
 * 监听流程引擎广播的事件时一些行为控制
 * <pre>比如：
 * 1. 在遇到异常时的处理策略
 * 2. 过滤事件
 * </pre>
 *
 * @author wangli
 * @since 2024/6/4 14:14
 */
public class BroadcastListenerConfigurationProperties {
    /**
     * 是否开启根据应用名过滤 MQ 事件
     */
    private Boolean enableFilterApplicationName = false;
    /**
     * 是否开启根据业务 ID 集合过滤 MQ 事件
     */
    private Boolean enableFilterDefinitionKey = true;

    /**
     * 过滤出 MQ 事件中包含这些业务 ID 的事件
     * <p>
     * 只有当 {@link  BroadcastListenerConfigurationProperties#enableFilterDefinitionKey} 才生效
     * <p>
     * 注意: 如果 enableFilterDefinitionKey = true,但该属性集合为空, 将<strong color=orange>不会过滤</strong>任何消息
     */
    private Set<String> filterProcessDefinitionKeys = new HashSet<>();

    /**
     * 失败处理策略：
     * <pre>
     * 1、FAIL_OVER, 当前listener执行出错，忽略继续往下执行，可配置重试相关参数，不抛出异常(默认策略)
     * 2、FAIL_FAST, 快速失败，出错直接抛出异常，listener不再往下执行
     * 3、FAIL_BACK, 失败自动恢复，在后台记录失败的消息，并按照一定的策略后期再进行重试，目前暂不支持
     * </pre>
     */
    private FailHandleTypeEnum failHandleType = FAIL_OVER;

    /**
     * 自动重试次数
     */
    private int numOfRetries = 3;

    /**
     * 初始等待时间,单位：毫秒
     */
    private int waitTimeInMs = 50;

    /**
     * 重试累乘因子
     */
    private int waitIncreaseFactor = 3;

    public Boolean getEnableFilterApplicationName() {
        return enableFilterApplicationName;
    }

    public void setEnableFilterApplicationName(Boolean enableFilterApplicationName) {
        this.enableFilterApplicationName = enableFilterApplicationName;
    }

    public Boolean getEnableFilterDefinitionKey() {
        return enableFilterDefinitionKey;
    }

    public void setEnableFilterDefinitionKey(Boolean enableFilterDefinitionKey) {
        this.enableFilterDefinitionKey = enableFilterDefinitionKey;
    }

    public Set<String> getFilterProcessDefinitionKeys() {
        return filterProcessDefinitionKeys;
    }

    public void setFilterProcessDefinitionKeys(Set<String> filterProcessDefinitionKeys) {
        this.filterProcessDefinitionKeys = filterProcessDefinitionKeys;
    }

    public FailHandleTypeEnum getFailHandleType() {
        return failHandleType;
    }

    public void setFailHandleType(FailHandleTypeEnum failHandleType) {
        this.failHandleType = failHandleType;
    }

    public int getNumOfRetries() {
        return numOfRetries;
    }

    public void setNumOfRetries(int numOfRetries) {
        this.numOfRetries = numOfRetries;
    }

    public int getWaitTimeInMs() {
        return waitTimeInMs;
    }

    public void setWaitTimeInMs(int waitTimeInMs) {
        this.waitTimeInMs = waitTimeInMs;
    }

    public int getWaitIncreaseFactor() {
        return waitIncreaseFactor;
    }

    public void setWaitIncreaseFactor(int waitIncreaseFactor) {
        this.waitIncreaseFactor = waitIncreaseFactor;
    }
}
