// Copyright 2022 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/examples/diagnostics/cpp/fidl.h>
#include <lib/async-loop/cpp/loop.h>
#include <lib/async-loop/default.h>
#include <lib/fidl/cpp/interface_ptr.h>
#include <lib/fidl/cpp/synchronous_interface_ptr.h>
#include <lib/sys/cpp/component_context.h>
#include <lib/sys/cpp/service_directory.h>
#include <lib/syslog/cpp/log_settings.h>
#include <lib/syslog/cpp/macros.h>
#include <unistd.h>

#include <cstdlib>
#include <iostream>

#include <src/lib/fxl/command_line.h>

void required_args() {
  FX_LOGS(FATAL) << "required args: "
                 << " --key <some_key> [--name <some_name>] [--balance value] [--delete]";
}

int main(int argc, const char **argv) {
  fuchsia_logging::SetTags({"workshop", "writer"});

  async::Loop loop(&kAsyncLoopConfigAttachToCurrentThread);

  if (argc < 3 || argv[1] != std::string("--key")) {
    required_args();
  }

  std::string key = argv[2];
  std::shared_ptr<sys::ServiceDirectory> svc = sys::ServiceDirectory::CreateFromNamespace();
  fidl::SynchronousInterfacePtr<fuchsia::examples::diagnostics::ProfileStore> store;
  svc->Connect(store.NewRequest());
  fidl::SynchronousInterfacePtr<fuchsia::examples::diagnostics::Profile> profile;
  store->CreateOrOpen(key, profile.NewRequest());

  for (int i = 3; i < argc; i += 2) {
    if (argv[i] == std::string("--name")) {
      if (i + 1 >= argc) {
        required_args();
      }
      FX_LOGS(INFO) << "set name for " << key;
      profile->SetName(argv[i + 1]);
    } else if (argv[i] == std::string("--balance")) {
      if (i + 1 >= argc) {
        required_args();
      }
      std::string::size_type sz;
      int64_t balance = std::stol(argv[i + 1], &sz, 10);
      FX_LOGS(INFO) << "update balance for " << key;

      if (balance >= 0) {
        profile->AddBalance(balance);
      } else {
        bool success;
        profile->WithdrawBalance(balance, &success);
        if (!success) {
          FX_LOGS(INFO) << "cannot withdraw balance for: " << key;
        }
      }
    } else if (argv[i] == std::string("--delete")) {
      bool success;
      profile.Unbind();
      FX_LOGS(INFO) << "delete profile for " << key;

      store->Delete(key, &success);
      if (!success) {
        FX_LOGS(INFO) << "cannot delete key: " << key;
        return 1;
      }
      break;
    }
  }
  // to make sure that logs are propagated
  sleep(3);
  return 0;
}
