// 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_TELEMETRY_BLUETOOTH_EVENT_SERVICE_IMPL_H_
#define DIAGNOSTICS_WILCO_DTC_SUPPORTD_TELEMETRY_BLUETOOTH_EVENT_SERVICE_IMPL_H_

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

#include <dbus/object_path.h>

#include "diagnostics/common/system/bluetooth_client.h"
#include "diagnostics/wilco_dtc_supportd/telemetry/bluetooth_event_service.h"

namespace diagnostics {

// Adapter for communication with bluetooth daemon.
class BluetoothEventServiceImpl final : public BluetoothEventService,
                                        public BluetoothClient::Observer {
 public:
  explicit BluetoothEventServiceImpl(BluetoothClient* bluetooth_client);
  ~BluetoothEventServiceImpl() override;

  const std::vector<BluetoothEventService::AdapterData>& GetLatestEvent()
      override;

  // BluetoothClient::Observer overrides:
  void AdapterAdded(
      const dbus::ObjectPath& adapter_path,
      const BluetoothClient::AdapterProperties& properties) override;
  void AdapterRemoved(const dbus::ObjectPath& adapter_path) override;
  void AdapterPropertyChanged(
      const dbus::ObjectPath& adapter_path,
      const BluetoothClient::AdapterProperties& properties) override;
  void DeviceAdded(
      const dbus::ObjectPath& device_path,
      const BluetoothClient::DeviceProperties& properties) override;
  void DeviceRemoved(const dbus::ObjectPath& device_path) override;
  void DevicePropertyChanged(
      const dbus::ObjectPath& device_path,
      const BluetoothClient::DeviceProperties& properties) override;

 private:
  void AdapterChanged(const dbus::ObjectPath& adapter_path,
                      const BluetoothClient::AdapterProperties& properties);
  void DeviceChanged(const dbus::ObjectPath& device_path,
                     const BluetoothClient::DeviceProperties& properties);
  void RemoveConnectedDevice(const dbus::ObjectPath& device_path);

  void UpdateAdapterConnectedDevicesCount(const dbus::ObjectPath& adapter_path);

  void UpdateAdaptersData();

  std::map<dbus::ObjectPath, AdapterData> adapters_;

  // AdapterPath to connected DevicePaths mapping.
  std::map<dbus::ObjectPath, std::set<dbus::ObjectPath>> connected_devices_;

  // DevicePath to AdapterPath mapping.
  std::map<dbus::ObjectPath, dbus::ObjectPath> device_to_adapter_;

  // Last adapters data that was sent to observers.
  std::vector<AdapterData> last_adapters_data_;

  // Not owned.
  BluetoothClient* bluetooth_client_;
};

}  // namespace diagnostics

#endif  // DIAGNOSTICS_WILCO_DTC_SUPPORTD_TELEMETRY_BLUETOOTH_EVENT_SERVICE_IMPL_H_
