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