// 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_WILCO_DTC_SUPPORTD_WILCO_DTC_SUPPORTD_ROUTINE_SERVICE_H_
#define DIAGNOSTICS_WILCO_DTC_SUPPORTD_WILCO_DTC_SUPPORTD_ROUTINE_SERVICE_H_

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

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

#include "diagnostics/routines/diag_routine.h"
#include "diagnostics/wilco_dtc_supportd/wilco_dtc_supportd_routine_factory.h"
#include "diagnostics/wilco_dtc_supportd/wilco_dtc_supportd_routine_factory_impl.h"
#include "wilco_dtc_supportd.pb.h"  // NOLINT(build/include)

namespace diagnostics {

// The routine service is responsible for creating and managing diagnostic
// routines.
class WilcoDtcSupportdRoutineService final {
 public:
  using GetAvailableRoutinesToServiceCallback = base::Callback<void(
      const std::vector<grpc_api::DiagnosticRoutine>& routines)>;
  using RunRoutineToServiceCallback =
      base::Callback<void(int uuid, grpc_api::DiagnosticRoutineStatus status)>;
  using GetRoutineUpdateRequestToServiceCallback =
      base::Callback<void(int uuid,
                          grpc_api::DiagnosticRoutineStatus status,
                          int progress_percent,
                          grpc_api::DiagnosticRoutineUserMessage user_message,
                          const std::string& output,
                          const std::string& status_message)>;

  WilcoDtcSupportdRoutineService();
  explicit WilcoDtcSupportdRoutineService(
      WilcoDtcSupportdRoutineFactory* routine_factory);
  ~WilcoDtcSupportdRoutineService();

  void GetAvailableRoutines(
      const GetAvailableRoutinesToServiceCallback& callback);
  void SetAvailableRoutinesForTesting(
      const std::vector<grpc_api::DiagnosticRoutine>& available_routines);
  void RunRoutine(const grpc_api::RunRoutineRequest& request,
                  const RunRoutineToServiceCallback& callback);
  void GetRoutineUpdate(
      int uuid,
      grpc_api::GetRoutineUpdateRequest::Command command,
      bool include_output,
      const GetRoutineUpdateRequestToServiceCallback& callback);

 private:
  std::unique_ptr<WilcoDtcSupportdRoutineFactoryImpl> routine_factory_impl_;
  WilcoDtcSupportdRoutineFactory* routine_factory_;
  // Map from uuids to instances of diagnostics routines that have
  // been started.
  std::map<int, std::unique_ptr<DiagnosticRoutine>> active_routines_;
  // Generator for uuids - currently, when we need a new uuids we
  // just return next_id_, then increment next_id_.
  int next_uuid_ = 1;
  std::vector<grpc_api::DiagnosticRoutine> available_routines_{
      grpc_api::ROUTINE_BATTERY, grpc_api::ROUTINE_BATTERY_SYSFS,
      grpc_api::ROUTINE_URANDOM};

  DISALLOW_COPY_AND_ASSIGN(WilcoDtcSupportdRoutineService);
};

}  // namespace diagnostics

#endif  // DIAGNOSTICS_WILCO_DTC_SUPPORTD_WILCO_DTC_SUPPORTD_ROUTINE_SERVICE_H_
