/*
 * Copyright (c) 2015, the Dart project authors.
 *
 * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
 * in compliance with the License. You may obtain a copy of the License at
 *
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 */
package org.dartlang.vm.service.element;

import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import org.dartlang.vm.service.internal.VmServiceConst;

/**
 * When an RPC encounters an error, it is provided in the _error_ property of the response object.
 * JSON-RPC errors always provide _code_, _message_, and _data_ properties. <br/>
 * Here is an example error response for our [streamListen](#streamlisten) request above. This error
 * would be generated if we were attempting to subscribe to the _GC_ stream multiple times from the
 * same client.
 *
 * <pre>
 * {
 *   "jsonrpc": "2.0",
 *   "error": {
 *     "code": 103,
 *     "message": "Stream already subscribed",
 *     "data": {
 *       "details": "The stream 'GC' is already subscribed"
 *     }
 *   }
 *   "id": "2"
 * }
 * </pre>
 * <p>
 * In addition the the [error codes](http://www.jsonrpc.org/specification#error_object) specified in
 * the JSON-RPC spec, we use the following application specific error codes:
 *
 * <pre>
 * code | message | meaning
 * ---- | ------- | -------
 * 100 | Feature is disabled | The operation is unable to complete because a feature is disabled
 * 101 | VM must be paused | This operation is only valid when the VM is paused
 * 102 | Cannot add breakpoint | The VM is unable to add a breakpoint at the specified line or function
 * 103 | Stream already subscribed | The client is already subscribed to the specified _streamId_
 * 104 | Stream not subscribed | The client is not subscribed to the specified _streamId_
 * </pre>
 */
public class RPCError extends Element implements VmServiceConst {

  /**
   * The response code used by the client when it receives a response from the server that it did
   * not expect. For example, it requested a library element but received a list.
   */
  public static final int UNEXPECTED_RESPONSE = 5;

  public static RPCError unexpected(String expectedType, Response response) {
    String errMsg = "Expected type " + expectedType + " but received " + response.getType();
    if (response instanceof Sentinel) {
      errMsg += ": " + ((Sentinel) response).getKind();
    }
    JsonObject json = new JsonObject();
    json.addProperty("code", UNEXPECTED_RESPONSE);
    json.addProperty("message", errMsg);
    JsonObject data = new JsonObject();
    data.addProperty("details", errMsg);
    data.add("response", response.getJson());
    json.add("data", data);
    return new RPCError(json);
  }

  public RPCError(JsonObject json) {
    super(json);
  }

  public int getCode() {
    return json.get("code").getAsInt();
  }

  public String getDetails() {
    JsonElement data = json.get("data");
    if (data instanceof JsonObject) {
      JsonElement details = ((JsonObject) data).get("details");
      if (details != null) {
        return details.getAsString();
      }
    }
    return null;
  }

  public String getMessage() {
    return json.get("message").getAsString();
  }

  public JsonObject getRequest() {
    JsonElement data = json.get("data");
    if (data instanceof JsonObject) {
      JsonElement request = ((JsonObject) data).get("request");
      if (request instanceof JsonObject) {
        return (JsonObject) request;
      }
    }
    return null;
  }
}
