package tech.easyflow.autoconfig.license;

/**
 * EasyFlow license 校验异常。
 */
public class EasyflowLicenseException extends RuntimeException {

    private final Reason reason;
    private final String location;
    private final String licenseId;
    private final String keyId;

    /**
     * 构造 license 校验异常。
     *
     * @param reason 异常类型
     * @param message 异常消息
     * @param location license 位置
     * @param licenseId licenseId
     * @param keyId keyId
     * @param cause 原始异常
     */
    public EasyflowLicenseException(Reason reason,
                                    String message,
                                    String location,
                                    String licenseId,
                                    String keyId,
                                    Throwable cause) {
        super(message, cause);
        this.reason = reason;
        this.location = location;
        this.licenseId = licenseId;
        this.keyId = keyId;
    }

    /**
     * 创建缺失类异常。
     *
     * @param message 异常消息
     * @param location license 位置
     * @return 异常实例
     */
    public static EasyflowLicenseException missing(String message, String location) {
        return new EasyflowLicenseException(Reason.MISSING, message, location, null, null, null);
    }

    /**
     * 创建缺失类异常。
     *
     * @param message 异常消息
     * @param location license 位置
     * @param cause 原始异常
     * @return 异常实例
     */
    public static EasyflowLicenseException missing(String message, String location, Throwable cause) {
        return new EasyflowLicenseException(Reason.MISSING, message, location, null, null, cause);
    }

    /**
     * 创建校验失败异常。
     *
     * @param message 异常消息
     * @param location license 位置
     * @param licenseId licenseId
     * @param keyId keyId
     * @return 异常实例
     */
    public static EasyflowLicenseException invalid(String message, String location, String licenseId, String keyId) {
        return new EasyflowLicenseException(Reason.INVALID, message, location, licenseId, keyId, null);
    }

    /**
     * 创建校验失败异常。
     *
     * @param message 异常消息
     * @param location license 位置
     * @param licenseId licenseId
     * @param keyId keyId
     * @param cause 原始异常
     * @return 异常实例
     */
    public static EasyflowLicenseException invalid(String message,
                                                   String location,
                                                   String licenseId,
                                                   String keyId,
                                                   Throwable cause) {
        return new EasyflowLicenseException(Reason.INVALID, message, location, licenseId, keyId, cause);
    }

    /**
     * 获取异常类型。
     *
     * @return 异常类型
     */
    public Reason getReason() {
        return reason;
    }

    /**
     * 获取 license 位置。
     *
     * @return license 位置
     */
    public String getLocation() {
        return location;
    }

    /**
     * 获取 licenseId。
     *
     * @return licenseId
     */
    public String getLicenseId() {
        return licenseId;
    }

    /**
     * 获取 keyId。
     *
     * @return keyId
     */
    public String getKeyId() {
        return keyId;
    }

    /**
     * 判断是否为缺失类异常。
     *
     * @return 是否缺失
     */
    public boolean isMissing() {
        return reason == Reason.MISSING;
    }

    /**
     * License 异常类型。
     */
    public enum Reason {
        MISSING,
        INVALID
    }
}
