/*
 * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved.
 *
 * https://www.mall4j.com/
 *
 * 未经允许，不可做商业用途！
 *
 * 版权所有，侵权必究！
 */
package com.yami.shop.common.response;

/**
 * `ResponseEnum` 是一个枚举类，用于定义项目中各种不同的响应状态相关的枚举常量，每个枚举常量代表了一种特定的响应情况，
 * 包含了对应的状态码（`code`）和提示消息（`msg`），方便在整个项目中统一管理和使用响应状态信息，
 * 例如在处理请求返回结果、异常处理等场景中，可以根据这些枚举常量来确定要返回给客户端的状态码以及对应的提示内容，
 * 使得响应状态的表示更加规范、清晰且易于维护。
 *
 * @author FrozenWatermelon
 * @date 2020/7/9
 */
public enum ResponseEnum {

    /**
     * 代表请求成功的枚举常量，状态码为 `"00000"`，提示消息为 `"ok"`，通常用于表示一个操作顺利完成，没有出现任何错误的情况，
     * 在业务逻辑处理成功后，可以使用这个枚举常量来构建成功的响应信息返回给客户端，告知客户端请求已被正确处理。
     */
    OK("00000", "ok"),

    /**
     * 代表显示失败的枚举常量，状态码为 `"A00001"`，提示消息为空字符串，主要用于表示一种需要向用户展示失败信息的通用情况，
     * 具体的失败提示内容可以根据实际业务场景另行设置（比如在使用该枚举抛出异常时，可以传入具体的错误消息），常用于各种业务操作失败的场景反馈。
     */
    SHOW_FAIL("A00001", ""),

    /**
     * 代表用于直接显示提示用户的错误的枚举常量，状态码未明确指定（这里主要关注其使用场景的描述），提示消息由具体输入内容决定，
     * 意味着在某些业务逻辑中，需要根据具体的错误情况动态生成提示用户的错误消息时，可以使用这个枚举常量来表示，强调了消息的灵活性和可定制性。
     */

    /**
     * 代表用于直接显示提示系统的成功的枚举常量，状态码未明确指定（这里主要关注其使用场景的描述），提示消息由具体输入内容决定，
     * 类似于上面用于提示用户错误的情况，不过此枚举是用于在需要根据具体情况动态生成提示系统成功的消息时使用，突出了消息内容的动态生成特性。
     */
    SHOW_SUCCESS("A00002", ""),

    /**
     * 代表未授权的枚举常量，状态码为 `"A00004"`，提示消息为 `"Unauthorized"`，用于表示客户端发起的请求未经过授权，
     * 例如用户没有登录或者没有相应权限去访问某个资源时，就可以使用这个枚举常量来构建相应的响应信息返回给客户端，告知客户端授权失败的情况。
     */
    UNAUTHORIZED("A00004", "Unauthorized"),

    /**
     * 代表服务器出现内部错误的枚举常量，状态码为 `"A00005"`，提示消息为 `"服务器出了点小差"`，
     * 当服务器在处理请求过程中发生了一些未知的、内部的异常情况时，可以使用这个枚举常量来构建响应信息返回给客户端，
     * 向客户端传达服务器出现问题的大致情况，同时避免暴露过多内部的错误细节。
     */
    EXCEPTION("A00005", "服务器出了点小差"),

    /**
     * 代表方法参数没有经过校验的枚举常量，状态码为 `"A00014"`，提示消息为 `"方法参数没有校验"`，
     * 用于在业务逻辑中发现传入的方法参数不符合预期或者没有经过必要的校验时，通过使用这个枚举常量来反馈参数校验方面的问题，
     * 告知客户端请求参数存在错误情况。
     */
    METHOD_ARGUMENT_NOT_VALID("A00014", "方法参数没有校验");

    // 用于存储每个枚举常量对应的状态码的私有属性，通过构造函数进行初始化，在项目中可以通过 `value()` 方法获取该状态码。
    private final String code;

    // 用于存储每个枚举常量对应的提示消息的私有属性，通过构造函数进行初始化，在项目中可以通过 `getMsg()` 方法获取该提示消息。
    private final String msg;

    /**
     * 获取枚举常量对应的状态码的方法，返回存储在 `code` 属性中的状态码值，方便在构建响应信息等场景中获取状态码来设置响应的状态码字段。
     *
     * @return 枚举常量对应的状态码字符串。
     */
    public String value() {
        return code;
    }

    /**
     * 获取枚举常量对应的提示消息的方法，返回存储在 `msg` 属性中的提示消息内容，用于在构建响应信息时获取相应的提示消息来设置响应的消息字段，
     * 或者在其他需要展示对应提示内容的场景中使用。
     *
     * @return 枚举常量对应的提示消息字符串。
     */
    public String getMsg() {
        return msg;
    }

    /**
     * 枚举类的构造函数，用于初始化每个枚举常量对应的状态码和提示消息，在定义枚举常量时通过传入相应的参数来设置其 `code` 和 `msg` 属性值，
     * 确保每个枚举常量都有明确的状态码和提示消息与之对应，用于后续在项目中的统一使用。
     *
     * @param code 枚举常量对应的状态码字符串，用于初始化 `code` 属性。
     * @param msg  枚举常量对应的提示消息字符串，用于初始化 `msg` 属性。
     */
    ResponseEnum(String code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    /**
     * 重写 `toString()` 方法，用于返回枚举常量更详细的字符串表示形式，除了包含默认的枚举相关信息外，
     * 还添加了状态码和提示消息的内容，方便在调试或者日志记录等场景中更清晰地查看枚举常量所代表的具体信息。
     *
     * @return 包含状态码、提示消息以及默认枚举相关信息的字符串表示形式。
     */
    @Override
    public String toString() {
        return "ResponseEnum{" + "code='" + code + '\'' + ", msg='" + msg + '\'' + "} " + super.toString();
    }
}