// Copyright 2014 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.

#include "base/macros.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "examples/browser/browser_host.mojom.h"
#include "examples/window_manager/window_manager.mojom.h"
#include "mojo/application/application_runner_chromium.h"
#include "mojo/common/common_type_converters.h"
#include "mojo/converters/geometry/geometry_type_converters.h"
#include "mojo/public/c/system/main.h"
#include "mojo/public/cpp/application/application_connection.h"
#include "mojo/public/cpp/application/application_delegate.h"
#include "mojo/public/cpp/application/application_impl.h"
#include "mojo/public/cpp/application/connect.h"
#include "mojo/public/cpp/application/service_provider_impl.h"
#include "mojo/services/navigation/public/interfaces/navigation.mojom.h"
#include "mojo/services/view_manager/public/cpp/view.h"
#include "mojo/services/view_manager/public/cpp/view_manager.h"
#include "mojo/services/view_manager/public/cpp/view_manager_client_factory.h"
#include "mojo/services/view_manager/public/cpp/view_manager_delegate.h"
#include "mojo/services/view_manager/public/cpp/view_observer.h"
#include "ui/events/event.h"
#include "url/gurl.h"

namespace mojo {
namespace examples {

// This is the basics of creating a views widget with a textfield.
// TODO: cleanup!
class Browser : public ApplicationDelegate,
                public ViewManagerDelegate,
                public ViewObserver,
                public examples::BrowserHost,
                public mojo::InterfaceFactory<examples::BrowserHost> {
 public:
  Browser() : shell_(nullptr), root_(NULL), binding_(this) {}

  virtual ~Browser() {
    if (root_)
      root_->RemoveObserver(this);
  }

 private:
  // Overridden from ApplicationDelegate:
  void Initialize(ApplicationImpl* app) override {
    shell_ = app->shell();
    view_manager_client_factory_.reset(
        new ViewManagerClientFactory(shell_, this));
    app->ConnectToService("mojo:window_manager", &window_manager_);

    // FIXME: Mojo applications don't know their URLs yet:
    // https://docs.google.com/a/chromium.org/document/d/1AQ2y6ekzvbdaMF5WrUQmneyXJnke-MnYYL4Gz1AKDos
    url_ = GURL(app->args()[1]);
  }

  bool ConfigureIncomingConnection(ApplicationConnection* connection) override {
    connection->AddService(view_manager_client_factory_.get());
    return true;
  }

  // ViewManagerDelegate:
  void OnEmbed(View* root,
               ServiceProviderImpl* exported_services,
               scoped_ptr<ServiceProvider> imported_services) override {
    // TODO: deal with OnEmbed() being invoked multiple times.
    ConnectToService(imported_services.get(), &navigator_host_);
    root_ = root;
    root_->AddObserver(this);
    root_->SetFocus();

    // Create a child view for our sky document.
    View* view = root->view_manager()->CreateView();
    root->AddChild(view);
    Rect bounds;
    bounds.x = 0;
    bounds.y = 0;
    bounds.width = root->bounds().width;
    bounds.height = root->bounds().height;
    view->SetBounds(bounds);
    view->SetVisible(true);
    root->SetVisible(true);

    scoped_ptr<mojo::ServiceProviderImpl> browser_host_services(
        new mojo::ServiceProviderImpl());
    browser_host_services->AddService(this);

    GURL frame_url = url_.Resolve("/examples/browser/browser.sky");
    browser_input_ =
        view->Embed(frame_url.spec(), browser_host_services.Pass());
  }

  void OnViewManagerDisconnected(ViewManager* view_manager) override {
    base::MessageLoop::current()->Quit();
  }

  // ViewObserver:
  void OnViewDestroyed(View* view) override {
    DCHECK_EQ(root_, view);
    view->RemoveObserver(this);
    root_ = NULL;
  }

  // examples::BrowserHost:
  void NavigateTo(const mojo::String& url) override {
    URLRequestPtr request(URLRequest::New());
    request->url = url;
    navigator_host_->RequestNavigate(TARGET_NEW_NODE, request.Pass());
  }

  // mojo::InterfaceFactory<examples::BrowserHost> implementation.
  void Create(mojo::ApplicationConnection* connection,
              mojo::InterfaceRequest<examples::BrowserHost> request) override {
    binding_.Bind(request.Pass());
  }

  Shell* shell_;

  scoped_ptr<mojo::ServiceProvider> browser_input_;

  scoped_ptr<ViewManagerClientFactory> view_manager_client_factory_;
  View* root_;
  NavigatorHostPtr navigator_host_;
  IWindowManagerPtr window_manager_;

  GURL url_;

  mojo::Binding<examples::BrowserHost> binding_;

  DISALLOW_COPY_AND_ASSIGN(Browser);
};

}  // namespace examples
}  // namespace mojo

MojoResult MojoMain(MojoHandle shell_handle) {
  mojo::ApplicationRunnerChromium runner(new mojo::examples::Browser);
  return runner.Run(shell_handle);
}
