// Copyright 2018 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_DPSL_INTERNAL_DPSL_REQUESTER_IMPL_H_
#define DIAGNOSTICS_DPSL_INTERNAL_DPSL_REQUESTER_IMPL_H_

#include <functional>
#include <memory>
#include <string>

#include <base/callback.h>
#include <base/macros.h>
#include <base/memory/scoped_refptr.h>
#include <base/memory/weak_ptr.h>
#include <base/sequence_checker_impl.h>
#include <base/single_thread_task_runner.h>
#include <brillo/grpc/async_grpc_client.h>

#include "diagnostics/dpsl/public/dpsl_requester.h"

#include "wilco_dtc_supportd.grpc.pb.h"  // NOLINT(build/include)

namespace diagnostics {

// Real implementation of the DpslRequester interface.
class DpslRequesterImpl final : public DpslRequester {
 public:
  static std::string GetWilcoDtcSupportdGrpcUri(
      DpslRequester::GrpcClientUri grpc_client_uri);

  explicit DpslRequesterImpl(const std::string& wilco_dtc_supportd_grpc_uri);
  DpslRequesterImpl(const DpslRequesterImpl&) = delete;
  DpslRequesterImpl& operator=(const DpslRequesterImpl&) = delete;

  ~DpslRequesterImpl() override;

  // DpslRequester overrides:
  void SendMessageToUi(
      std::unique_ptr<grpc_api::SendMessageToUiRequest> request,
      SendMessageToUiCallback callback) override;
  void GetProcData(std::unique_ptr<grpc_api::GetProcDataRequest> request,
                   GetProcDataCallback callback) override;
  void GetSysfsData(std::unique_ptr<grpc_api::GetSysfsDataRequest> request,
                    GetSysfsDataCallback callback) override;
  void PerformWebRequest(
      std::unique_ptr<grpc_api::PerformWebRequestParameter> request,
      PerformWebRequestCallback callback) override;
  void GetEcTelemetry(std::unique_ptr<grpc_api::GetEcTelemetryRequest> request,
                      GetEcTelemetryRequestCallback callback) override;
  void GetAvailableRoutines(
      std::unique_ptr<grpc_api::GetAvailableRoutinesRequest> request,
      GetAvailableRoutinesCallback callback) override;
  void RunRoutine(std::unique_ptr<grpc_api::RunRoutineRequest> request,
                  RunRoutineCallback callback) override;
  void GetRoutineUpdate(
      std::unique_ptr<grpc_api::GetRoutineUpdateRequest> request,
      GetRoutineUpdateCallback callback) override;
  void GetOsVersion(std::unique_ptr<grpc_api::GetOsVersionRequest> request,
                    GetOsVersionCallback callback) override;
  void GetConfigurationData(
      std::unique_ptr<grpc_api::GetConfigurationDataRequest> request,
      GetConfigurationDataCallback callback) override;
  void GetVpdField(std::unique_ptr<grpc_api::GetVpdFieldRequest> request,
                   GetVpdFieldCallback callback) override;
  void GetDriveSystemData(
      std::unique_ptr<grpc_api::GetDriveSystemDataRequest> request,
      GetDriveSystemDataCallback callback) override;
  void RequestBluetoothDataNotification(
      std::unique_ptr<grpc_api::RequestBluetoothDataNotificationRequest>
          request,
      RequestBluetoothDataNotificationCallback callback) override;
  void GetStatefulPartitionAvailableCapacity(
      std::unique_ptr<grpc_api::GetStatefulPartitionAvailableCapacityRequest>
          request,
      GetStatefulPartitionAvailableCapacityCallback callback) override;

 private:
  using AsyncGrpcWilcoDtcSupportdClient =
      brillo::AsyncGrpcClient<grpc_api::WilcoDtcSupportd>;

  // Posts a task to the main thread that runs CallGrpcClientMethod() with the
  // specified arguments.
  //
  // Note: this method can be called from any thread.
  template <typename GrpcStubMethod,
            typename RequestType,
            typename ResponseType>
  void ScheduleGrpcClientMethodCall(
      const base::Location& location,
      GrpcStubMethod grpc_stub_method,
      std::unique_ptr<RequestType> request,
      std::function<void(std::unique_ptr<ResponseType>)> response_callback);

  // Runs |async_grpc_client_|'s CallRpc() method with the specified arguments.
  template <typename GrpcStubMethod,
            typename RequestType,
            typename ResponseType>
  void CallGrpcClientMethod(
      GrpcStubMethod grpc_stub_method,
      std::unique_ptr<RequestType> request,
      base::Callback<void(grpc::Status, std::unique_ptr<ResponseType>)>
          response_callback);

  // Task runner of the main thread (on which this instance was created).
  const scoped_refptr<base::SingleThreadTaskRunner> task_runner_;

  AsyncGrpcWilcoDtcSupportdClient async_grpc_client_;

  // Whether Shutdown() was already called on |async_grpc_client_|.
  bool async_grpc_client_shutting_down_ = false;

  base::SequenceCheckerImpl sequence_checker_;

  // Must be the last member.
  base::WeakPtrFactory<DpslRequesterImpl> weak_ptr_factory_{this};
};

}  // namespace diagnostics

#endif  // DIAGNOSTICS_DPSL_INTERNAL_DPSL_REQUESTER_IMPL_H_
