// 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) {
    browser_host_services_impl_.AddService(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,
               InterfaceRequest<ServiceProvider> services,
               ServiceProviderPtr exposed_services) override {
    // TODO: deal with OnEmbed() being invoked multiple times.
    ConnectToService(exposed_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);

    ServiceProviderPtr browser_host_services;
    browser_host_services_impl_.Bind(GetProxy(&browser_host_services));

    GURL frame_url = url_.Resolve("/examples/browser/browser.sky");
    view->Embed(frame_url.spec(), nullptr, 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<ViewManagerClientFactory> view_manager_client_factory_;
  View* root_;
  NavigatorHostPtr navigator_host_;
  IWindowManagerPtr window_manager_;
  ServiceProviderImpl browser_host_services_impl_;

  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);
}
