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

#ifndef DIAGNOSTICS_CROS_HEALTHD_CROS_HEALTHD_ROUTINE_SERVICE_IMPL_H_
#define DIAGNOSTICS_CROS_HEALTHD_CROS_HEALTHD_ROUTINE_SERVICE_IMPL_H_

#include <map>
#include <memory>
#include <set>
#include <string>
#include <vector>

#include <base/optional.h>

#include "diagnostics/cros_healthd/cros_healthd_routine_factory.h"
#include "diagnostics/cros_healthd/cros_healthd_routine_service.h"
#include "diagnostics/cros_healthd/routines/diag_routine.h"
#include "diagnostics/cros_healthd/system/context.h"
#include "mojo/cros_healthd.mojom.h"

namespace diagnostics {

// Production implementation of the CrosHealthdRoutineService interface.
class CrosHealthdRoutineServiceImpl final : public CrosHealthdRoutineService {
 public:
  CrosHealthdRoutineServiceImpl(Context* context,
                                CrosHealthdRoutineFactory* routine_factory);
  CrosHealthdRoutineServiceImpl(const CrosHealthdRoutineServiceImpl&) = delete;
  CrosHealthdRoutineServiceImpl& operator=(
      const CrosHealthdRoutineServiceImpl&) = delete;
  ~CrosHealthdRoutineServiceImpl() override;

  // CrosHealthdRoutineService overrides:
  std::vector<MojomCrosHealthdDiagnosticRoutineEnum> GetAvailableRoutines()
      override;
  void RunBatteryCapacityRoutine(
      uint32_t low_mah,
      uint32_t high_mah,
      int32_t* id,
      MojomCrosHealthdDiagnosticRoutineStatusEnum* status) override;
  void RunBatteryHealthRoutine(
      uint32_t maximum_cycle_count,
      uint32_t percent_battery_wear_allowed,
      int32_t* id,
      MojomCrosHealthdDiagnosticRoutineStatusEnum* status) override;
  void RunUrandomRoutine(
      uint32_t length_seconds,
      int32_t* id,
      MojomCrosHealthdDiagnosticRoutineStatusEnum* status) override;
  void RunSmartctlCheckRoutine(
      int32_t* id,
      MojomCrosHealthdDiagnosticRoutineStatusEnum* status) override;
  void RunAcPowerRoutine(
      MojomCrosHealthdAcPowerStatusEnum expected_status,
      const base::Optional<std::string>& expected_power_type,
      int32_t* id,
      MojomCrosHealthdDiagnosticRoutineStatusEnum* status) override;
  void RunCpuCacheRoutine(
      base::TimeDelta exec_duration,
      int32_t* id,
      MojomCrosHealthdDiagnosticRoutineStatusEnum* status) override;
  void RunCpuStressRoutine(
      base::TimeDelta exec_duration,
      int32_t* id,
      MojomCrosHealthdDiagnosticRoutineStatusEnum* status) override;
  void RunFloatingPointAccuracyRoutine(
      base::TimeDelta exec_duration,
      int32_t* id,
      MojomCrosHealthdDiagnosticRoutineStatusEnum* status) override;
  void RunNvmeWearLevelRoutine(
      uint32_t wear_level_threshold,
      int32_t* id,
      MojomCrosHealthdDiagnosticRoutineStatusEnum* status) override;
  void RunNvmeSelfTestRoutine(
      MojomCrosHealthdNvmeSelfTestTypeEnum nvme_self_test_type,
      int32_t* id,
      MojomCrosHealthdDiagnosticRoutineStatusEnum* status) override;
  void RunDiskReadRoutine(
      chromeos::cros_healthd::mojom::DiskReadRoutineTypeEnum type,
      base::TimeDelta exec_duration,
      uint32_t file_size_mb,
      int32_t* id,
      MojomCrosHealthdDiagnosticRoutineStatusEnum* status) override;
  void RunPrimeSearchRoutine(
      base::TimeDelta exec_duration,
      uint64_t max_num,
      int32_t* id,
      MojomCrosHealthdDiagnosticRoutineStatusEnum* status) override;
  void RunBatteryDischargeRoutine(
      base::TimeDelta exec_duration,
      uint32_t maximum_discharge_percent_allowed,
      int32_t* id,
      MojomCrosHealthdDiagnosticRoutineStatusEnum* status) override;
  void GetRoutineUpdate(
      int32_t id,
      MojomCrosHealthdDiagnosticRoutineCommandEnum command,
      bool include_output,
      chromeos::cros_healthd::mojom::RoutineUpdate* response) override;

 private:
  void RunRoutine(
      std::unique_ptr<DiagnosticRoutine> routine,
      chromeos::cros_healthd::mojom::DiagnosticRoutineEnum routine_enum,
      int32_t* id_out,
      chromeos::cros_healthd::mojom::DiagnosticRoutineStatusEnum* status);

  // Checks what routines are supported on the device and populates the member
  // available_routines_.
  void PopulateAvailableRoutines();

  // Map from IDs to instances of diagnostics routines that have
  // been started.
  std::map<int32_t, std::unique_ptr<DiagnosticRoutine>> active_routines_;
  // Generator for IDs - currently, when we need a new ID we just return
  // next_id_, then increment next_id_.
  int32_t next_id_ = 1;
  // Each of the supported diagnostic routines. Must be kept in sync with the
  // enums in diagnostics/mojo/cros_health_diagnostics.mojom.
  std::set<chromeos::cros_healthd::mojom::DiagnosticRoutineEnum>
      available_routines_;
  // Unowned pointer that should outlive this instance.
  Context* const context_ = nullptr;
  // Responsible for making the routines. Unowned pointer that should outlive
  // this instance.
  CrosHealthdRoutineFactory* routine_factory_ = nullptr;
};

}  // namespace diagnostics

#endif  // DIAGNOSTICS_CROS_HEALTHD_CROS_HEALTHD_ROUTINE_SERVICE_IMPL_H_
