package cn.wise.im.common.http;

import lombok.Data;

import java.io.Serializable;

@Data
public class R<T> implements Serializable {
  private Integer code;
 
  private String message;
 
  private T data;
 
  private R() {
  }
 
  public static <T> R<T> ok() {
    return createResult(ResponseEnum.SUCCESS.getCode(), null, null);
  }
 
  public static <T> R<T> ok(T data) {
    return createResult(ResponseEnum.SUCCESS.getCode(), ResponseEnum.SUCCESS.getMessage(), data);
  }
 
  public static <T> R<T> ok(String message) {
    return createResult(ResponseEnum.SUCCESS.getCode(), message, null);
  }
 
  public static <T> R<T> ok(T data, String message) {
    return createResult(ResponseEnum.SUCCESS.getCode(), message, data);
  }
 
  public static <T> R<T> fail() {
    return createResult(ResponseEnum.FAIL.getCode(), ResponseEnum.FAIL.getMessage(), null);
  }
 
  public static <T> R<T> fail(ResponseEnum responseCode) {
    return createResult(responseCode.getCode(), responseCode.getMessage(), null);
  }
 
  public static <T> R<T> fail(ResponseEnum responseCode, T data) {
    return createResult(responseCode.getCode(), responseCode.getMessage(), data);
  }
 
  public static <T> R<T> fail(ResponseEnum responseCode, String message) {
    return createResult(responseCode.getCode(),
        String.format("%s %s", responseCode.getMessage(), message), null);
  }
 
  public static <T> R<T> fail(Integer code, String message) {
    return createResult(code, message, null);
  }
 
  private static <T> R<T> createResult(Integer code, String message, T data) {
    R<T> r = new R<>();
    r.setCode(code);
    r.setMessage(message);
    r.setData(data);
    return r;
  }
}