// Copyright 2016 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 "mojo/application/application_runner_chromium.h"
#include "mojo/common/binding_set.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/interface_factory.h"
#include "mojo/public/cpp/bindings/strong_binding.h"
#include "mojo/public/cpp/system/macros.h"
#include "mojo/services/authentication/interfaces/authentication.mojom.h"
#include "mojo/services/network/interfaces/network_service.mojom.h"
#include "services/authentication/google_authentication_impl.h"

namespace authentication {

class GoogleAccountManagerApp
    : public mojo::ApplicationDelegate,
      public mojo::InterfaceFactory<AuthenticationService> {
 public:
  GoogleAccountManagerApp() {}
  ~GoogleAccountManagerApp() override {}

  void Initialize(mojo::ApplicationImpl* app) override {
    app->ConnectToService("mojo:network_service", &network_service_);
    app->ConnectToService("mojo:files", &files_);

    app_url_ = app->url();
  }

  bool ConfigureIncomingConnection(
      mojo::ApplicationConnection* connection) override {
    connection->AddService<AuthenticationService>(this);
    return true;
  }

  void Create(mojo::ApplicationConnection* connection,
              mojo::InterfaceRequest<AuthenticationService> request) override {
    mojo::files::Error error = mojo::files::Error::INTERNAL;
    mojo::files::DirectoryPtr directory;
    files_->OpenFileSystem("app_persistent_cache", GetProxy(&directory),
                           [&error](mojo::files::Error e) { error = e; });
    CHECK(files_.WaitForIncomingResponse());
    if (mojo::files::Error::OK != error) {
      LOG(FATAL) << "Unable to initialize accounts DB";
    }
    new authentication::GoogleAuthenticationServiceImpl(
        request.Pass(), app_url_, network_service_, directory);
  }

 private:
  mojo::NetworkServicePtr network_service_;
  mojo::files::FilesPtr files_;
  std::string app_url_;

  DISALLOW_COPY_AND_ASSIGN(GoogleAccountManagerApp);
};

}  // namespace authentication

MojoResult MojoMain(MojoHandle application_request) {
  mojo::ApplicationRunnerChromium runner(
      new authentication::GoogleAccountManagerApp());
  return runner.Run(application_request);
}
