/*
 * Copyright 2015 Google Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
 *
 * 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.
 */

#ifndef COBALT_WEBDRIVER_PROTOCOL_RESPONSE_H_
#define COBALT_WEBDRIVER_PROTOCOL_RESPONSE_H_

#include <string>

#include "base/memory/scoped_ptr.h"
#include "base/optional.h"
#include "base/values.h"
#include "cobalt/webdriver/protocol/session_id.h"

namespace cobalt {
namespace webdriver {
namespace protocol {

class Response {
 public:
  // WebDriver Response Status Codes:
  // https://code.google.com/p/selenium/wiki/JsonWireProtocol#Response_Status_Codes
  enum StatusCode {
    // The command executed successfully.
    kSuccess = 0,

    // An element could not be located on the page using the given search
    // parameters.
    kNoSuchElement = 7,

    // A request to switch to a frame could not be satisfied because the frame
    // could not be found.
    kNoSuchFrame = 8,

    // The requested resource could not be found, or a request was received
    // using an HTTP method that is not supported by the mapped resource.
    kUnknownCommand = 9,

    // An element command failed because the referenced element is no longer
    // attached to the DOM.
    kStaleElementReference = 10,

    // An element command could not be completed because the element is not
    // visible on the page.
    kElementNotVisible = 11,

    // An unknown server-side error occurred while processing the command.
    kUnknownError = 13,

    // An error occurred while executing user supplied JavaScript.
    kJavaScriptError = 17,

    // An operation did not complete before its timeout expired.
    kTimeOut = 21,

    // The specified window has been closed, or otherwise couldn't be found.
    kNoSuchWindow = 23,

    // An illegal attempt was made to set a cookie under a different domain than
    // the current page.
    kInvalidCookieDomain = 24,

    // An attempt was made to operate on a modal dialog when one was not open.
    kNoAlertOpenError = 27,

    // A new session could not be created.
    kSessionNotCreatedException = 33,
  };

  // Create a JSON object that will be used as the response body for a failed
  // command:
  // https://code.google.com/p/selenium/wiki/JsonWireProtocol#Failed_Commands
  // TODO: Add support for screenshot, stack trace, etc.
  static scoped_ptr<base::Value> CreateErrorResponse(
      const std::string& message);

  // Create a JSON object that will be used as the response body for a command:
  // https://code.google.com/p/selenium/wiki/JsonWireProtocol#Responses
  static scoped_ptr<base::Value> CreateResponse(
      const base::optional<protocol::SessionId>& session_id,
      StatusCode status_code, scoped_ptr<base::Value> webdriver_response_value);
};

}  // namespace protocol
}  // namespace webdriver
}  // namespace cobalt
#endif  // COBALT_WEBDRIVER_PROTOCOL_RESPONSE_H_
