/*
 * 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_SESSION_DRIVER_H_
#define COBALT_WEBDRIVER_SESSION_DRIVER_H_

#if defined(ENABLE_WEBDRIVER)

#include <string>
#include <vector>

#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "base/message_loop_proxy.h"
#include "base/synchronization/lock.h"
#include "base/time.h"
#include "cobalt/dom/window.h"
#include "cobalt/webdriver/protocol/capabilities.h"
#include "cobalt/webdriver/protocol/log_entry.h"
#include "cobalt/webdriver/protocol/log_type.h"
#include "cobalt/webdriver/protocol/session_id.h"
#include "cobalt/webdriver/util/command_result.h"
#include "cobalt/webdriver/window_driver.h"
#include "googleurl/src/gurl.h"

namespace cobalt {
namespace webdriver {

class SessionDriver {
 public:
  // Factory callback to create a WindowDriver for the currently displayed
  // Window.
  typedef base::Callback<scoped_ptr<webdriver::WindowDriver>(
      const webdriver::protocol::WindowId& window_id)>
      CreateWindowDriverCallback;

  typedef base::Callback<bool(const base::TimeDelta&)>
      WaitForNavigationFunction;

  SessionDriver(const protocol::SessionId& session_id,
                const CreateWindowDriverCallback& create_window_driver_cb,
                const WaitForNavigationFunction& wait_for_navigation);

  void RefreshWindowDriver();

  const protocol::SessionId& session_id() const { return session_id_; }
  WindowDriver* GetWindow(const protocol::WindowId& window_id);
  WindowDriver* GetCurrentWindow() { return window_driver_.get(); }

  util::CommandResult<void> Navigate(const GURL& url);
  util::CommandResult<protocol::Capabilities> GetCapabilities();
  util::CommandResult<protocol::WindowId> GetCurrentWindowHandle();
  util::CommandResult<std::vector<protocol::WindowId> > GetWindowHandles();

  util::CommandResult<std::vector<std::string> > GetLogTypes();
  util::CommandResult<std::vector<protocol::LogEntry> > GetLog(
      const protocol::LogType& type);
  util::CommandResult<std::string> GetAlertText();
  util::CommandResult<void> SwitchToWindow(const protocol::WindowId& window_id);

  ~SessionDriver();

 private:
  protocol::WindowId GetUniqueWindowId();

  bool LogMessageHandler(int severity, const char* file, int line,
                         size_t message_start, const std::string& str);

  base::ThreadChecker thread_checker_;
  const protocol::SessionId session_id_;
  protocol::Capabilities capabilities_;
  CreateWindowDriverCallback create_window_driver_callback_;
  WaitForNavigationFunction wait_for_navigation_;
  int32 next_window_id_;
  scoped_ptr<WindowDriver> window_driver_;

  int logging_callback_id_;
  typedef std::vector<protocol::LogEntry> LogEntryVector;
  LogEntryVector log_entries_;
  base::Lock log_lock_;
};

}  // namespace webdriver
}  // namespace cobalt

#endif  // defined(ENABLE_WEBDRIVER)
#endif  // COBALT_WEBDRIVER_SESSION_DRIVER_H_
