// Copyright 2020 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 <base/check.h>
#include <base/logging.h>
#include <dbus/dlcservice/dbus-constants.h>

#include "dlcservice/error.h"
#include "dlcservice/metrics.h"

using dlcservice::metrics::InstallResult;
using dlcservice::metrics::UninstallResult;
using std::string;

namespace dlcservice {

namespace metrics {

const char kMetricInstallResult[] = "Platform.DlcService.InstallResult";
const char kMetricUninstallResult[] = "Platform.DlcService.UninstallResult";
}  // namespace metrics

// IMPORTANT: To obsolete a metric enum value, just remove it from the map
// initialization and comment it out on the Enum.
Metrics::InstallResultMap Metrics::install_result_ = {
    {error::kFailedToCreateDirectory, InstallResult::kFailedToCreateDirectory},
    {error::kFailedInstallInUpdateEngine,
     InstallResult::kFailedInstallInUpdateEngine},
    {kErrorInvalidDlc, InstallResult::kFailedInvalidDlc},      // dbus error
    {kErrorNeedReboot, InstallResult::kFailedNeedReboot},      // dbus error
    {kErrorBusy, InstallResult::kFailedUpdateEngineBusy},      // dbus error
    {kErrorNoImageFound, InstallResult::kFailedNoImageFound},  // dbus error
    {error::kFailedToVerifyImage, InstallResult::kFailedToVerifyImage},
    {error::kFailedToMountImage, InstallResult::kFailedToMountImage},
};

Metrics::UninstallResultMap Metrics::uninstall_result_ = {
    {kErrorInvalidDlc, UninstallResult::kFailedInvalidDlc},  // dbus error
    {kErrorBusy, UninstallResult::kFailedUpdateEngineBusy},  // dbus error
};

void Metrics::Init() {
  metrics_library_->Init();
}

void Metrics::SendInstallResultSuccess(const bool& installed_by_ue) {
  if (installed_by_ue) {
    SendInstallResult(InstallResult::kSuccessNewInstall);
  } else {
    SendInstallResult(InstallResult::kSuccessAlreadyInstalled);
  }
}

void Metrics::SendInstallResultFailure(brillo::ErrorPtr* err) {
  DCHECK(err->get());
  InstallResult res = InstallResult::kUnknownError;
  if (err && err->get()) {
    const string error_code = Error::GetRootErrorCode(*err);
    auto it = install_result_.find(error_code);
    if (it != install_result_.end())
      res = it->second;
  }
  SendInstallResult(res);
}

void Metrics::SendInstallResult(InstallResult result) {
  metrics_library_->SendEnumToUMA(
      metrics::kMetricInstallResult, static_cast<int>(result),
      static_cast<int>(InstallResult::kNumConstants));
  // TODO(andrewlassalle): Remove log after 2020-12-25
  LOG(INFO) << "InstallResult metric sent:" << static_cast<int>(result);
}

void Metrics::SendUninstallResult(brillo::ErrorPtr* err) {
  UninstallResult res = UninstallResult::kUnknownError;
  if (err && err->get()) {
    const string error_code = Error::GetRootErrorCode(*err);
    auto it = uninstall_result_.find(error_code);
    if (it != uninstall_result_.end())
      res = it->second;
  } else {
    res = UninstallResult::kSuccess;
  }
  SendUninstallResult(res);
}

void Metrics::SendUninstallResult(UninstallResult result) {
  metrics_library_->SendEnumToUMA(
      metrics::kMetricUninstallResult, static_cast<int>(result),
      static_cast<int>(UninstallResult::kNumConstants));
}

}  // namespace dlcservice
