// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package androidx.test.espresso.flutter.internal.jsonrpc.message;

import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
import static com.google.common.base.Strings.isNullOrEmpty;

import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.annotations.SerializedName;
import java.util.Objects;
import javax.annotation.Nullable;

/**
 * JSON-RPC 2.0 request object.
 *
 * <p>See https://www.jsonrpc.org/specification for detailed specification.
 */
public final class JsonRpcRequest {

  private static final Gson gson = new Gson();

  private static final String JSON_RPC_VERSION = "2.0";

  /** Specifying the version of the JSON-RPC protocol. Must be "2.0". */
  @SerializedName("jsonrpc")
  private final String version;

  /**
   * An identifier of the request. Could be String, a number, or null. In this implementation, we
   * always use String as the type. If null, this is a notification and no response is required.
   */
  @Nullable private final String id;

  /** A String containing the name of the method to be invoked. */
  private final String method;

  /** Parameter values to be used during the invocation of the method. */
  private JsonObject params;

  /**
   * Deserializes the given Json string to a {@code JsonRpcRequest} object.
   *
   * @param jsonString the string from which the object is to be deserialized.
   * @return the deserialized object.
   */
  public static JsonRpcRequest fromJson(String jsonString) {
    checkArgument(!isNullOrEmpty(jsonString), "Json string cannot be null or empty.");
    JsonRpcRequest request = gson.fromJson(jsonString, JsonRpcRequest.class);
    checkState(JSON_RPC_VERSION.equals(request.getVersion()), "JSON-RPC version must be 2.0.");
    checkState(
        !isNullOrEmpty(request.getMethod()), "JSON-RPC request must contain the method field.");
    return request;
  }

  /**
   * Constructs with the given method name. The JSON-RPC version will be defaulted to "2.0".
   *
   * @param method the method name of this request.
   */
  private JsonRpcRequest(String method) {
    this(null, method);
  }

  /**
   * Constructs with the given id and method name. The JSON-RPC version will be defaulted to "2.0".
   *
   * @param id the id of this request.
   * @param method the method name of this request.
   */
  private JsonRpcRequest(@Nullable String id, String method) {
    this.version = JSON_RPC_VERSION;
    this.id = id;
    this.method = checkNotNull(method, "JSON-RPC request method cannot be null.");
  }

  /**
   * Gets the JSON-RPC version.
   *
   * @return the JSON-RPC version. Should always be "2.0".
   */
  public String getVersion() {
    return version;
  }

  /**
   * Gets the id of this JSON-RPC request.
   *
   * @return the id of this request. Returns null if this is a notification request.
   */
  public String getId() {
    return id;
  }

  /**
   * Gets the method name of this JSON-RPC request.
   *
   * @return the method name.
   */
  public String getMethod() {
    return method;
  }

  /** Gets the params used in this request. */
  public JsonObject getParams() {
    return params;
  }

  /**
   * Serializes this object to its equivalent Json representation.
   *
   * @return the Json representation of this object.
   */
  public String toJson() {
    return gson.toJson(this);
  }

  /**
   * Equivalent to {@link #toJson()}.
   *
   * @return the Json representation of this object.
   */
  @Override
  public String toString() {
    return toJson();
  }

  @Override
  public boolean equals(Object obj) {
    if (obj instanceof JsonRpcRequest) {
      JsonRpcRequest objRequest = (JsonRpcRequest) obj;
      return Objects.equals(objRequest.id, this.id)
          && Objects.equals(objRequest.method, this.method)
          && Objects.equals(objRequest.params, this.params);
    } else {
      return false;
    }
  }

  @Override
  public int hashCode() {
    int hash = Objects.hashCode(id);
    hash = hash * 31 + Objects.hashCode(method);
    hash = hash * 31 + Objects.hashCode(params);
    return hash;
  }

  /** Builder for {@link JsonRpcRequest}. */
  public static class Builder {

    /** The request id. Could be null if the request is a notification. */
    @Nullable private String id;

    /** A String containing the name of the method to be invoked. */
    private String method;

    /** Parameter values to be used during the invocation of the method. */
    private JsonObject params = new JsonObject();

    /** Empty constructor. */
    public Builder() {}

    /**
     * Constructs an instance with the given method name.
     *
     * @param method the method name of this request builder.
     */
    public Builder(String method) {
      this.method = method;
    }

    /** Sets the id of this request builder. */
    public Builder setId(@Nullable String id) {
      this.id = id;
      return this;
    }

    /** Sets the method name of this request builder. */
    public Builder setMethod(String method) {
      this.method = method;
      return this;
    }

    /** Sets the params of this request builder. */
    public Builder setParams(JsonObject params) {
      this.params = params;
      return this;
    }

    /** Sugar method to add a {@code String} param to this request builder. */
    public Builder addParam(String tag, String value) {
      params.addProperty(tag, value);
      return this;
    }

    /** Sugar method to add an integer param to this request builder. */
    public Builder addParam(String tag, int value) {
      params.addProperty(tag, value);
      return this;
    }

    /** Sugar method to add a {@code boolean} param to this request builder. */
    public Builder addParam(String tag, boolean value) {
      params.addProperty(tag, value);
      return this;
    }

    /** Builds and returns a {@code JsonRpcRequest} instance out of this builder. */
    public JsonRpcRequest build() {
      JsonRpcRequest request = new JsonRpcRequest(id, method);
      if (params != null && params.size() != 0) {
        request.params = this.params;
      }
      return request;
    }
  }
}
