// 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_PUBLIC_DPSL_RPC_HANDLER_H_
#define DIAGNOSTICS_DPSL_PUBLIC_DPSL_RPC_HANDLER_H_

#include <functional>
#include <memory>

#include "wilco_dtc.pb.h"  // NOLINT(build/include)

namespace diagnostics {

// Abstract class that corresponds to the WilcoDtc gRPC interface
// (defined at grpc/wilco_dtc.proto).
//
// EXAMPLE USAGE:
//
//   class MyRpcHandler : public DpslRpcHandler {
//     void HandleMessageFromUi(...) override {
//       ... // custom logic
//     }
//   };
//
//   MyRpcHandler my_rpc_handler;
//   auto thread_context = DpslThreadContext.Create(...);
//   auto rpc_server = DpslRpcServer::Create(..., &my_rpc_handler, ...);
//   if (!rpc_server) {
//     ... // Handle error
//   }
//   thread_context->RunEventLoop();
//
// This will start a gRPC server that listens for incoming requests on the
// WilcoDtc interface at the specified gRPC URI. These requests will be
// transformed by DPSL into |my_rpc_handler|'s method calls.
//
// NOTE ON THREADING MODEL: The DPSL implementation ensures that, whenever it
// calls methods of this class, it does that on the same thread - the one on
// which DpslRpcServer was created.
// It's allowed to call the callbacks, which are supplied by DPSL to methods
// of this class, from any thread.
//
// NOTE ON REQUESTS SEQUENCE: Parallel requests are possible: DPSL may make a
// new call of a method of this class before the previous one ran its callback.
//
// NOTE ON LONG-RUNNING TASKS: It's recommended to avoid doing long-running
// tasks in overridden methods of this class on the current thread, since this
// would block the thread from running other jobs, like serving subsequent
// incoming requests. Therefore it's advisable to offload time-consuming
// operations onto background threads.
class DpslRpcHandler {
 public:
  // Request-specific callback types. These callbacks are passed by DPSL and
  // should be used by the implementation to return method results.
  //
  // When |response| is passed as null, the whole request is considered canceled
  // (i.e., the wilco_dtc_supportd daemon receives the cancellation error for
  // this request).
  using HandleMessageFromUiCallback = std::function<void(
      std::unique_ptr<grpc_api::HandleMessageFromUiResponse> response)>;
  using HandleEcNotificationCallback = std::function<void(
      std::unique_ptr<grpc_api::HandleEcNotificationResponse> response)>;
  using HandlePowerNotificationCallback = std::function<void(
      std::unique_ptr<grpc_api::HandlePowerNotificationResponse> response)>;
  using HandleConfigurationDataChangedCallback = std::function<void(
      std::unique_ptr<grpc_api::HandleConfigurationDataChangedResponse>
          response)>;
  using HandleBluetoothDataChangedCallback = std::function<void(
      std::unique_ptr<grpc_api::HandleBluetoothDataChangedResponse> response)>;

  virtual ~DpslRpcHandler() = default;

  // Methods of the WilcoDtc gRPC interface.
  //
  // The |request| parameters are guaranteed to be non-null. The supplied
  // |callback| must be run no more than once (and until this happens, the
  // request is considered as running and consumes resources). It's allowed to
  // run |callback| from any thread.

  virtual void HandleMessageFromUi(
      std::unique_ptr<grpc_api::HandleMessageFromUiRequest> request,
      HandleMessageFromUiCallback callback) = 0;
  virtual void HandleEcNotification(
      std::unique_ptr<grpc_api::HandleEcNotificationRequest> request,
      HandleEcNotificationCallback callback) = 0;
  virtual void HandlePowerNotification(
      std::unique_ptr<grpc_api::HandlePowerNotificationRequest> request,
      HandlePowerNotificationCallback callback) = 0;
  virtual void HandleConfigurationDataChanged(
      std::unique_ptr<grpc_api::HandleConfigurationDataChangedRequest> request,
      HandleConfigurationDataChangedCallback callback) = 0;
  virtual void HandleBluetoothDataChanged(
      std::unique_ptr<grpc_api::HandleBluetoothDataChangedRequest> request,
      HandleBluetoothDataChangedCallback callback) = 0;
};

}  // namespace diagnostics

#endif  // DIAGNOSTICS_DPSL_PUBLIC_DPSL_RPC_HANDLER_H_
