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

package com.yami.shop.common.response;

import lombok.Data;

import java.io.Serializable;
import java.util.Objects;

/**
 * `ServerResponse`类是一个通用的服务器响应类，用于在服务端与客户端之间传递响应信息，它采用了泛型的设计，使得可以承载各种不同类型的数据作为响应内容返回给客户端，
 * 并且通过`lombok`的`@Data`注解自动生成了常用的属性访问方法（如`getter`、`setter`方法）以及`toString`、`hashCode`和`equals`等方法，简化了代码编写，方便对对象属性的操作和使用。
 * 该类实现了`Serializable`接口，意味着它的实例可以被序列化和反序列化，便于在网络传输或者持久化存储等场景下使用，确保响应信息能够准确无误地在不同环境间传递。
 *
 * @author lanhai
 */
@Data
public class ServerResponse<T> implements Serializable {

    /**
     * 响应状态码，用于表示请求处理的结果状态，不同的整数值对应不同的业务含义，例如常见的约定中，`200` 可能表示成功，`404` 表示资源未找到，`500` 表示服务器内部错误等，
     * 在具体的项目中会根据业务需求定义一套自己的状态码规范，通过这个属性可以清晰地告知客户端请求的处理情况到底是成功还是出现了某种类型的错误，方便客户端根据状态码进行相应的处理。
     */
    private int code;

    /**
     * 响应消息，是对响应状态的一个文字描述信息，用于更详细地向客户端解释请求处理的结果情况，
     * 比如当状态码表示错误时，这里可以具体说明是何种错误，像“用户名或密码错误”“数据库连接失败”等具体的错误提示内容，使得客户端能够直观地了解出现问题的原因，
     * 也可以在成功时给出一些友好的提示信息，增强用户体验。
     */
    private String msg;

    /**
     * 响应数据对象，通过泛型 `<T>` 来表示可以是任意类型的数据，根据具体的业务请求，这个属性可以承载不同类型的返回结果，
     * 例如请求商品列表时，这里可以是商品信息的列表对象；请求用户详情时，这里可以是包含用户详细信息的对象等，实现了灵活地传递业务数据给客户端的功能。
     */
    private T obj;

    /**
     * 判断当前响应是否表示成功的方法，通过比较响应的状态码和预定义的成功状态码（这里应该是 `ResponseCode.SUCCESS`，不过从当前代码来看 `ResponseCode` 类未展示出来，推测它是定义了各种状态码常量的类）是否相等来确定。
     * 如果相等，意味着请求处理成功，返回 `true`；否则返回 `false`，表示请求出现了某种问题没有成功处理，客户端可以根据这个方法的返回值来决定后续如何展示界面或者进行其他操作，
     * 比如成功时展示返回的数据，失败时弹出相应的错误提示信息等。
     *
     * @return 返回一个布尔值，`true` 表示响应表示成功，`false` 表示响应表示出现了问题，请求未成功处理。
     */
    public boolean isSuccess() {
        return Objects.equals(ResponseCode.SUCCESS, this.code);
    }
}