// Copyright 2019 The Chromium OS 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 "diagnostics/common/system/debugd_adapter_impl.h"

#include <string>
#include <utility>

#include <base/bind.h>
#include <base/logging.h>
#include <base/memory/ptr_util.h>
#include <brillo/errors/error.h>

#include "debugd/dbus-proxies.h"

namespace diagnostics {

namespace {

constexpr char kSmartctlAttributesOption[] = "attributes";
constexpr char kNvmeIdentityOption[] = "identify_controller";
constexpr char kNvmeShortSelfTestOption[] = "short_self_test";
constexpr char kNvmeLongSelfTestOption[] = "long_self_test";
constexpr char kNvmeStopSelfTestOption[] = "stop_self_test";

auto CreateSuccessCallback(
    const DebugdAdapter::StringResultCallback& callback) {
  return base::Bind(
      [](const DebugdAdapter::StringResultCallback& callback,
         const std::string& result) { callback.Run(result, nullptr); },
      callback);
}

auto CreateErrorCallback(const DebugdAdapter::StringResultCallback& callback) {
  return base::Bind(
      [](const DebugdAdapter::StringResultCallback& callback,
         brillo::Error* error) { callback.Run(std::string(), error); },
      callback);
}

}  // namespace

DebugdAdapterImpl::DebugdAdapterImpl(
    std::unique_ptr<org::chromium::debugdProxyInterface> debugd_proxy)
    : debugd_proxy_(std::move(debugd_proxy)) {
  DCHECK(debugd_proxy_);
}

DebugdAdapterImpl::~DebugdAdapterImpl() = default;

void DebugdAdapterImpl::GetSmartAttributes(
    const StringResultCallback& callback) {
  debugd_proxy_->SmartctlAsync(kSmartctlAttributesOption,
                               CreateSuccessCallback(callback),
                               CreateErrorCallback(callback));
}

void DebugdAdapterImpl::GetNvmeIdentity(const StringResultCallback& callback) {
  debugd_proxy_->NvmeAsync(kNvmeIdentityOption, CreateSuccessCallback(callback),
                           CreateErrorCallback(callback));
}

void DebugdAdapterImpl::RunNvmeShortSelfTest(
    const StringResultCallback& callback) {
  debugd_proxy_->NvmeAsync(kNvmeShortSelfTestOption,
                           CreateSuccessCallback(callback),
                           CreateErrorCallback(callback));
}

void DebugdAdapterImpl::RunNvmeLongSelfTest(
    const StringResultCallback& callback) {
  debugd_proxy_->NvmeAsync(kNvmeLongSelfTestOption,
                           CreateSuccessCallback(callback),
                           CreateErrorCallback(callback));
}

void DebugdAdapterImpl::StopNvmeSelfTest(const StringResultCallback& callback) {
  debugd_proxy_->NvmeAsync(kNvmeStopSelfTestOption,
                           CreateSuccessCallback(callback),
                           CreateErrorCallback(callback));
}

void DebugdAdapterImpl::GetNvmeLog(uint32_t page_id,
                                   uint32_t length,
                                   bool raw_binary,
                                   const StringResultCallback& callback) {
  debugd_proxy_->NvmeLogAsync(page_id, length, raw_binary,
                              CreateSuccessCallback(callback),
                              CreateErrorCallback(callback));
}

}  // namespace diagnostics
