// Copyright 2019 The Fuchsia 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 <fuchsia/ledger/cloud/cpp/fidl.h>
#include <lib/async-loop/cpp/loop.h>
#include <lib/async/cpp/task.h>
#include <lib/fidl/cpp/binding_set.h>
#include <lib/sys/cpp/component_context.h>

#include <memory>

#include "src/ledger/cloud_provider_in_memory/lib/fake_cloud_provider.h"
#include "src/lib/fxl/macros.h"

namespace cloud_provider {
namespace {

class App {
 public:
  explicit App() : component_context_(sys::ComponentContext::Create()) {
    FXL_DCHECK(component_context_);
  }
  ~App() {}

  bool Start() {
    cloud_provider_impl_ = std::make_unique<ledger::FakeCloudProvider>();

    component_context_->outgoing()->AddPublicService<CloudProvider>(
        [this](fidl::InterfaceRequest<CloudProvider> request) {
          cloud_provider_bindings_.AddBinding(cloud_provider_impl_.get(),
                                              std::move(request));
        });

    return true;
  }

 private:
  std::unique_ptr<sys::ComponentContext> component_context_;
  std::unique_ptr<ledger::FakeCloudProvider> cloud_provider_impl_;
  fidl::BindingSet<CloudProvider> cloud_provider_bindings_;

  FXL_DISALLOW_COPY_AND_ASSIGN(App);
};

int Main(int argc, const char** argv) {
  async::Loop loop(&kAsyncLoopConfigAttachToThread);

  App app;
  int return_code = 0;
  async::PostTask(loop.dispatcher(), [&return_code, &app, &loop] {
    if (!app.Start()) {
      return_code = -1;
      loop.Quit();
    }
  });
  loop.Run();
  return return_code;
}

}  // namespace
}  // namespace cloud_provider

int main(int argc, const char** argv) {
  return cloud_provider::Main(argc, argv);
}
