// 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 MEDIA_PERCEPTION_DBUS_SERVICE_H_
#define MEDIA_PERCEPTION_DBUS_SERVICE_H_

#include <functional>
#include <string>
#include <utility>
#include <vector>

namespace mri {

// TODO(lasoren): Move these string and enum definitions to a separate file from
// this abstract base class.
constexpr char kMediaPerceptionServiceName[] = "org.chromium.MediaPerception";
constexpr char kMediaPerceptionServicePath[] = "/org/chromium/MediaPerception";

// The following values are meant to be used in checking dbus method call names.
constexpr char kState[] = "State";
constexpr char kGetDiagnostics[] = "GetDiagnostics";
constexpr char kDetectionSignal[] = "MediaPerceptionDetection";
constexpr char kBootstrapMojoConnection[] = "BootstrapMojoConnection";

enum Service { MEDIA_PERCEPTION };

enum Method { STATE, GET_DIAGNOSTICS, BOOTSTRAP_MOJO_CONNECTION };

enum Signal { MEDIA_PERCEPTION_DETECTION };

// This class provides a generic base class for encapsulating methods used for
// communicating over D-Bus.
class DbusService {
 public:
  virtual ~DbusService() {}

  // Handler for incoming method calls. |bytes| stores the reply message.
  using MessageHandler =
      std::function<bool(const Method method, const uint8_t *arg_bytes,
                         const int arg_size, std::vector<uint8_t> *bytes)>;

  // This handler function should be set after the DBusService is instantiated
  // to handle incoming D-Bus messages.
  void SetMessageHandler(MessageHandler message_handler) {
    message_handler_ = std::move(message_handler);
  }

  std::string ServiceEnumToServiceName(const Service service) {
    switch (service) {
      case MEDIA_PERCEPTION:
        return kMediaPerceptionServiceName;
    }
    return "";
  }

  std::string ServiceEnumToServicePath(const Service service) {
    switch (service) {
      case MEDIA_PERCEPTION:
        return kMediaPerceptionServicePath;
    }
    return "";
  }

  std::string MethodEnumToMethodName(const Method method) {
    switch (method) {
      case STATE:
        return kState;
      case GET_DIAGNOSTICS:
        return kGetDiagnostics;
      case BOOTSTRAP_MOJO_CONNECTION:
        return kBootstrapMojoConnection;
    }
    return "";
  }

  std::string SignalEnumToSignalName(const Signal signal) {
    switch (signal) {
      case MEDIA_PERCEPTION_DETECTION:
        return kDetectionSignal;
    }
    return "";
  }

  // Pure virtuals for the interfaces that need to be available in the
  // implementation.
  virtual void Connect(const Service service) = 0;
  virtual bool IsConnected() const = 0;
  virtual bool PublishSignal(const Signal signal,
                             const std::vector<uint8_t> *bytes) = 0;
  virtual void PollMessageQueue() = 0;

 protected:
  MessageHandler message_handler_;

  // Stores the service enum for the active connection.
  Service service_;
};

}  // namespace mri

#endif  // MEDIA_PERCEPTION_DBUS_SERVICE_H_
