// Copyright 2017 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 "peridot/lib/testing/ledger_repository_for_testing.h"

#include <utility>

#include <fuchsia/modular/cpp/fidl.h>
#include <lib/fsl/io/fd.h>

#include "peridot/lib/common/teardown.h"
#include "peridot/lib/fidl/app_client.h"
#include "peridot/lib/ledger_client/constants.h"
#include "peridot/lib/ledger_client/status.h"

namespace modular {

namespace testing {

LedgerRepositoryForTesting::LedgerRepositoryForTesting()
    : startup_context_(component::StartupContext::CreateFromStartupInfo()) {
  fuchsia::modular::AppConfig ledger_config;
  ledger_config.url = kLedgerAppUrl;

  auto& launcher = startup_context_->launcher();
  ledger_app_client_ =
      std::make_unique<AppClient<fuchsia::ledger::internal::LedgerController>>(
          launcher.get(), std::move(ledger_config));

  ledger_repo_factory_.set_error_handler([](zx_status_t status) {
    FXL_CHECK(false) << "LedgerRepositoryFactory returned an error. Status: "
                     << LedgerEpitaphToString(status);
  });
  ledger_app_client_->services().ConnectToService(
      ledger_repo_factory_.NewRequest());
}

LedgerRepositoryForTesting::~LedgerRepositoryForTesting() = default;

fuchsia::ledger::internal::LedgerRepository*
LedgerRepositoryForTesting::ledger_repository() {
  if (!ledger_repo_) {
    ledger_repo_factory_->GetRepository(
        fsl::CloneChannelFromFileDescriptor(tmp_fs_.root_fd()), nullptr, "",
        ledger_repo_.NewRequest());
  }

  return ledger_repo_.get();
}

void LedgerRepositoryForTesting::Terminate(std::function<void()> done) {
  if (ledger_app_client_) {
    ledger_app_client_->Teardown(kBasicTimeout, [this, done] {
      ledger_repo_factory_.Unbind();
      ledger_app_client_.reset();
      done();
    });

  } else {
    done();
  }
}

}  // namespace testing
}  // namespace modular
