// Copyright 2017 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.

#ifndef ARC_SETUP_ARC_SETUP_METRICS_H_
#define ARC_SETUP_ARC_SETUP_METRICS_H_

#include <memory>
#include <string>

#include <base/macros.h>
#include <base/time/time.h>

class MetricsLibraryInterface;

namespace arc {

// Enum is append only and need to match the definition in
// Chromium's src/tools/metrics/histograms/enums.xml.
enum class ArcBootContinueCodeInstallationResult {
  SUCCESS = 0,
  ERROR_HOST_SIDE_CODE_NOT_READY = 1,
  ERROR_CANNOT_INSTALL_HOST_CODE = 2,
  COUNT
};

// Enum is append only and need to match the definition in
// Chromium's src/tools/metrics/histograms/enums.xml.
enum class ArcCodeRelocationResult {
  SUCCESS = 0,
  ERROR_BOOTLOCKBOXD_NOT_READY = 1,
  ERROR_UNABLE_TO_RELOCATE = 2,
  ERROR_UNABLE_TO_SIGN = 3,
  SALT_EMPTY = 4,
  COUNT
};

// Enum is append only and need to match the definition in
// Chromium's src/tools/metrics/histograms/enums.xml.
enum class ArcCodeVerificationResult {
  SUCCESS = 0,
  ERROR_BOOTLOCKBOXD_NOT_READY = 1,
  OTA = 2,
  INVALID_CODE = 3,
  COUNT
};

// Enum is append only and need to match the definition in
// Chromium's src/tools/metrics/histograms/enums.xml.
// Note we only care important upgrade types listed below, rather than
// all possible permutations.
enum class ArcSdkVersionUpgradeType {
  NO_UPGRADE = 0,
  UNKNOWN_UPGRADE = 1,
  UNKNOWN_DOWNGRADE = 2,
  // M_TO_N is deprecated
  M_TO_P = 4,
  N_TO_P = 5,
  // P_TO_Q is deprecated
  N_TO_R = 7,
  P_TO_R = 8,
  COUNT
};

// A class that sends UMA metrics using MetricsLibrary. There is no D-Bus call
// because MetricsLibrary writes the UMA data to /var/lib/metrics/uma-events.
class ArcSetupMetrics {
 public:
  ArcSetupMetrics();
  ArcSetupMetrics(const ArcSetupMetrics&) = delete;
  ArcSetupMetrics& operator=(const ArcSetupMetrics&) = delete;

  ~ArcSetupMetrics() = default;

  // Sends host code verification result.
  bool SendCodeVerificationResult(
      ArcCodeVerificationResult verification_result);

  // Sends host code relocation result.
  bool SendCodeRelocationResult(ArcCodeRelocationResult relocation_result);

  // Sends the time verifying host generated code.
  bool SendCodeVerificationTime(base::TimeDelta verificaiton_time);

  // Sends the time relocating android boot*.art code.
  bool SendCodeRelocationTime(base::TimeDelta relocation_time);

  // Sends boot-continue host code installation results.
  bool SendBootContinueCodeInstallationResult(
      ArcBootContinueCodeInstallationResult verification_result);

  // Sends host code signing time using TPM bootlockbox.
  bool SendCodeSigningTime(base::TimeDelta signing_time);

  // Sends total time on host code integrity checking. This includes time on
  // verification. And also the time on relocation and signing if verification
  // fails.
  bool SendCodeIntegrityCheckingTotalTime(base::TimeDelta total_time);

  // Sends the type of SDK version upgrade.
  bool SendSdkVersionUpgradeType(ArcSdkVersionUpgradeType upgrade_type);

  void SetMetricsLibraryForTesting(
      std::unique_ptr<MetricsLibraryInterface> metrics_library);

  MetricsLibraryInterface* metrics_library_for_testing() {
    return metrics_library_.get();
  }

 private:
  bool SendDurationToUMA(const std::string& metric_name,
                         base::TimeDelta duration);

  std::unique_ptr<MetricsLibraryInterface> metrics_library_;
};

}  // namespace arc

#endif  // ARC_SETUP_ARC_SETUP_METRICS_H_
