// Copyright 2015 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 <stdio.h>

#include "examples/bank_app/bank.mojom.h"
#include "mojo/public/c/system/main.h"
#include "mojo/public/cpp/application/application_impl.h"
#include "mojo/public/cpp/application/application_runner.h"
#include "mojo/public/cpp/utility/run_loop.h"
#include "mojo/services/vanadium/security/interfaces/principal.mojom.h"

namespace examples {

class LoginHandler {
 public:
  void Run(const vanadium::BlessingPtr& b) const {
    std::string user;
    if (b && b->chain.size() > 0) {
      user = b->chain[0]->extension;
      for (size_t i = 1; i < b->chain.size(); i++) {
        user += vanadium::ChainSeparator;
        user += b->chain[i]->extension;
      }
    }
    if (!user.empty()) {
      MOJO_LOG(INFO) << "Welcome: " << user;
    }
  }
};

class BankCustomer : public mojo::ApplicationDelegate {
 public:
  void Initialize(mojo::ApplicationImpl* app) override {
    // Get user login credentials
    app->ConnectToService("mojo:principal_service", &login_service_);
    login_service_->Login(LoginHandler());
    // Check and see whether we got a valid user blessing.
    if (!login_service_.WaitForIncomingResponse()) {
      MOJO_LOG(INFO) << "Login() to the principal service failed\n";
    }
    BankPtr bank;
    app->ConnectToService("mojo:bank", &bank);
    bank->Deposit(500/*usd*/);
    bank->Withdraw(100/*usd*/);
    auto gb_callback = [](const int32_t& balance) {
      MOJO_LOG(INFO) << "Bank balance: " << balance;
    };
    bank->GetBalance(mojo::Callback<void(const int32_t&)>(gb_callback));
    bank.WaitForIncomingResponse();
  }
  void Quit() override {
    login_service_->Logout();
  }
 private:
  vanadium::PrincipalServicePtr login_service_;
};

}  // namespace examples

MojoResult MojoMain(MojoHandle application_request) {
  mojo::ApplicationRunner runner(new examples::BankCustomer);
  return runner.Run(application_request);
}
