// Copyright 2016 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/bin/ledger/app/ledger_impl.h"

#include <memory>
#include <string>
#include <utility>

#include <fuchsia/ledger/internal/cpp/fidl.h>
#include <lib/callback/trace_callback.h>
#include <lib/fidl/cpp/optional.h>
#include <lib/fxl/logging.h>
#include <trace/event.h>
#include <zircon/syscalls.h>

#include "peridot/bin/ledger/app/constants.h"
#include "peridot/bin/ledger/app/page_impl.h"
#include "peridot/bin/ledger/fidl/include/types.h"

namespace ledger {

LedgerImpl::LedgerImpl(Environment* environment, Delegate* delegate)
    : environment_(environment), delegate_(delegate) {}

LedgerImpl::~LedgerImpl() {}

void LedgerImpl::GetRootPage(fidl::InterfaceRequest<Page> page_request,
                             GetRootPageCallback callback) {
  delegate_->GetPage(
      kRootPageId, Delegate::PageState::NAMED, std::move(page_request),
      TRACE_CALLBACK(std::move(callback), "ledger", "ledger_get_root_page"));
}

void LedgerImpl::GetPage(PageIdPtr id,
                         fidl::InterfaceRequest<Page> page_request,
                         GetPageCallback callback) {
  Delegate::PageState page_state = Delegate::PageState::NAMED;
  if (!id) {
    id = fidl::MakeOptional(PageId());
    environment_->random()->Draw(&id->id);
    page_state = Delegate::PageState::NEW;
  }
  delegate_->GetPage(
      id->id, page_state, std::move(page_request),
      TRACE_CALLBACK(std::move(callback), "ledger", "ledger_get_page"));
}

void LedgerImpl::SetConflictResolverFactory(
    fidl::InterfaceHandle<ConflictResolverFactory> factory,
    SetConflictResolverFactoryCallback callback) {
  TRACE_DURATION("ledger", "ledger_set_conflict_resolver_factory");

  delegate_->SetConflictResolverFactory(std::move(factory));
  callback(Status::OK);
}

}  // namespace ledger
