// 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_
