package cn.wisenergy.common.utils;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.apache.http.HttpStatus;

import java.io.Serializable;

/**
 * 响应信息类
 *
 * @author lut
 */
@Data
@ApiModel(description = "响应信息主体")
public class R<T> implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty("返回标记：成功标记=0，失败标记1")
    private int code;
    @ApiModelProperty("返回信息")
    private String message;
    @ApiModelProperty("数据")
    private T data;

    public R() {
        this.code = 0;
        this.message = "success";
    }

    public R(int code, String msg) {
        this.code = code;
        this.message = msg;
    }

    public R(int code, T data) {
        this.code = code;
        this.data = data;
    }

    public R(T data) {
        this.code = 0;
        this.message = "success";
        this.data = data;
    }

    public R(T data, String msg) {
        this.code = 0;
        this.data = data;
        this.message = msg;
    }

    public R(int code, String msg,T data) {
        this.code = code;
        this.data = data;
        this.message = msg;
    }

    /**
     * 请求成功
     */
    public static <T> R<T> ok() {
        return new R<>();
    }

    /**
     * 请求成功，返回前端的信息
     *
     * @param msg 描述
     * @return R
     */
    public static <T> R<T> ok(String msg, T data) {
        return new R<>(data, msg);
    }

    /**
     * 请求成功，返回前端的信息
     *
     * @param msg 描述
     * @return R
     */
    public static <T> R<T> ok(String msg, int code) {
        return new R<>(code, msg);
    }

    /**
     * 请求成功，返回前端的信息
     *
     * @param data 返回值
     * @return R
     */
    public static <T> R<T> ok(T data) {
        return new R<>(0, data);
    }

    /**
     * 请求成功，返回前端信息
     *
     * @param code 状态码
     * @param data 返回值
     * @return R
     */
    public static <T> R<T> ok(int code, T data) {
        return new R<>(code, data);
    }

    /**
     * 请求失败
     *
     * @return R
     */
    public static <T> R<T> error() {
        return new R<>(-1, "操作失败");
    }

    /**
     * 请求失败，返回前台信息
     *
     * @param msg 描述
     * @return R
     */
    public static <T> R<T> error(String msg) {
        return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, msg);
    }

    /**
     * 请求失败，返回前台信息
     *
     * @param code 错误码
     * @param msg  描述
     * @return R
     */
    public static <T> R<T> error(int code, String msg) {
        return new R<>(code, msg);
    }

    /**
     * 请求失败，返回前台信息
     *
     * @param code 错误码
     * @param msg  描述
     * @return R
     */
    public static <T> R<T> error(int code, String msg,T data) {
        return new R<>(code, msg,data);
    }

}
