package com.usky.common.core.exception;

import java.util.stream.Stream;

import static com.usky.common.core.exception.ErrorMessageConsts.SYS_ERROR_CODE_PREFIX;

/**
 * <p>系统错误码定义</p>
 * <ul>
 * <li>该类仅包含预定义系统错误码，自定义错误不允许添加到该类中</li>
 * <li>若需要自定，请自行在所属模块新建 XXXErrorCode.java 类使用</li>
 * </ul>
 *
 * @author chenpeng
 * Create time 2018年11月30日 下午1:10:10
 * @see ErrorCode
 */
public enum SystemErrorCode implements ErrorCode {

    /**
     * 系统内部错误
     */
    SYS_SYSTEM_ERROR(SYS_ERROR_CODE_PREFIX + "0000", "Internal system error"),
    /**
     * 系统堆内存不足
     */
    SYS_SYSTEM_OOM_ERROR(SYS_ERROR_CODE_PREFIX + "0001", "Insufficient heap memory"),
    /**
     * 系统栈溢出
     */
    SYS_SYSTEM_SOF_ERROR(SYS_ERROR_CODE_PREFIX + "0002", "stack overflow"),
    /*
     * Feign 调用结果解码错误
     */
    SYS_SYSTEM_FEIGN_RESULT_DECODE_ERROR(SYS_ERROR_CODE_PREFIX + "0003", "Feign decode result error"),
    /**
     * package 路径查找错误
     */
    SYS_SYSTEM_PKG_RESOLVE_ERROR(SYS_ERROR_CODE_PREFIX + "0004", "package path can't be found"),
    /**
     * MQ 消息发送失败
     */
    SYS_SYSTEM_MQ_SEND_ERROR(SYS_ERROR_CODE_PREFIX + "0005", "MQ send message fail"),
    /**
     * MQ 消费失败
     */
    SYS_SYSTEM_MQ_CONSUME_ERROR(SYS_ERROR_CODE_PREFIX + "0006", "MQ consume message fail");

    private String code;
    private String defaultMessage;

    SystemErrorCode(String code, String defaultMessage) {
        this.code = code;
        this.defaultMessage = defaultMessage;
    }

    /**
     * <p>通过 code 获得对应 SystemErrorCode 实例</p>
     *
     * @author chenpeng
     * Create at May 29, 2019 at 14:33:32 GMT+8
     */
    public static SystemErrorCode getByCode(String code) {
        return Stream.of(values())
                .filter(e -> e.getCode().equals(code))
                .findFirst()
                .orElse(null);
    }

    @Override
    public String getCode() {
        return code;
    }

    @Override
    public String getDefaultMessage() {
        return defaultMessage;
    }
}
