// Copyright 2016 The Chromium 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 DEVICE_BLUETOOTH_BLUETOOTH_LOW_ENERGY_WIN_FAKE_H_
#define DEVICE_BLUETOOTH_BLUETOOTH_LOW_ENERGY_WIN_FAKE_H_

#include <memory>
#include <set>
#include <unordered_map>

#include "device/bluetooth/bluetooth_low_energy_win.h"

namespace device {
namespace win {

struct BLEDevice;
struct GattService;
struct GattCharacteristic;
struct GattCharacteristicObserver;
struct GattDescriptor;

// The key of BLEDevicesMap is the string of the BLE device address.
typedef std::unordered_map<std::string, std::unique_ptr<BLEDevice>>
    BLEDevicesMap;
// The key of GattServicesMap, GattCharacteristicsMap and GattDescriptorsMap is
// the string of the attribute handle.
typedef std::unordered_map<std::string, std::unique_ptr<GattService>>
    GattServicesMap;
typedef std::unordered_map<std::string, std::unique_ptr<GattCharacteristic>>
    GattCharacteristicsMap;
typedef std::unordered_map<std::string, std::unique_ptr<GattDescriptor>>
    GattDescriptorsMap;
// The key of BLEAttributeHandleTable is the string of the BLE device address.
typedef std::unordered_map<std::string, std::unique_ptr<std::set<USHORT>>>
    BLEAttributeHandleTable;
// The key of GattCharacteristicObserverTable is GattCharacteristicObserver
// pointer.
// Note: The underlying data type of BLUETOOTH_GATT_EVENT_HANDLE is PVOID.
typedef std::unordered_map<BLUETOOTH_GATT_EVENT_HANDLE,
                           std::unique_ptr<GattCharacteristicObserver>>
    GattCharacteristicObserverTable;

struct BLEDevice {
  BLEDevice();
  ~BLEDevice();
  std::unique_ptr<BluetoothLowEnergyDeviceInfo> device_info;
  GattServicesMap primary_services;
  bool marked_as_deleted;
};

struct GattService {
  GattService();
  ~GattService();
  std::unique_ptr<BTH_LE_GATT_SERVICE> service_info;
  GattServicesMap included_services;
  GattCharacteristicsMap included_characteristics;
};

struct GattCharacteristic {
  GattCharacteristic();
  ~GattCharacteristic();
  std::unique_ptr<BTH_LE_GATT_CHARACTERISTIC> characteristic_info;
  std::unique_ptr<BTH_LE_GATT_CHARACTERISTIC_VALUE> value;
  GattDescriptorsMap included_descriptors;
  std::vector<HRESULT> read_errors;
  std::vector<HRESULT> write_errors;
  std::vector<HRESULT> notify_errors;
  std::vector<BLUETOOTH_GATT_EVENT_HANDLE> observers;
};

struct GattDescriptor {
  GattDescriptor();
  ~GattDescriptor();
  std::unique_ptr<BTH_LE_GATT_DESCRIPTOR> descriptor_info;
  std::unique_ptr<BTH_LE_GATT_DESCRIPTOR_VALUE> value;
};

struct GattCharacteristicObserver {
  GattCharacteristicObserver();
  ~GattCharacteristicObserver();
  PFNBLUETOOTH_GATT_EVENT_CALLBACK_CORRECTED callback;
  PVOID context;
};

// Fake implementation of BluetoothLowEnergyWrapper. Used for BluetoothTestWin.
class BluetoothLowEnergyWrapperFake : public BluetoothLowEnergyWrapper {
 public:
  class Observer {
   public:
    Observer() {}
    ~Observer() {}

    virtual void OnReadGattCharacteristicValue() = 0;
    virtual void OnWriteGattCharacteristicValue(
        const PBTH_LE_GATT_CHARACTERISTIC_VALUE value) = 0;
    virtual void OnStartCharacteristicNotification() = 0;
    virtual void OnWriteGattDescriptorValue(
        const std::vector<uint8_t>& value) = 0;
  };

  BluetoothLowEnergyWrapperFake();
  ~BluetoothLowEnergyWrapperFake() override;

  bool IsBluetoothLowEnergySupported() override;
  bool EnumerateKnownBluetoothLowEnergyDevices(
      std::vector<std::unique_ptr<BluetoothLowEnergyDeviceInfo>>* devices,
      std::string* error) override;
  bool EnumerateKnownBluetoothLowEnergyGattServiceDevices(
      std::vector<std::unique_ptr<BluetoothLowEnergyDeviceInfo>>* devices,
      std::string* error) override;
  bool EnumerateKnownBluetoothLowEnergyServices(
      const base::FilePath& device_path,
      std::vector<std::unique_ptr<BluetoothLowEnergyServiceInfo>>* services,
      std::string* error) override;
  HRESULT ReadCharacteristicsOfAService(
      base::FilePath& service_path,
      const PBTH_LE_GATT_SERVICE service,
      std::unique_ptr<BTH_LE_GATT_CHARACTERISTIC>* out_included_characteristics,
      USHORT* out_counts) override;
  HRESULT ReadDescriptorsOfACharacteristic(
      base::FilePath& service_path,
      const PBTH_LE_GATT_CHARACTERISTIC characteristic,
      std::unique_ptr<BTH_LE_GATT_DESCRIPTOR>* out_included_descriptors,
      USHORT* out_counts) override;
  HRESULT ReadCharacteristicValue(
      base::FilePath& service_path,
      const PBTH_LE_GATT_CHARACTERISTIC characteristic,
      std::unique_ptr<BTH_LE_GATT_CHARACTERISTIC_VALUE>* out_value) override;
  HRESULT WriteCharacteristicValue(
      base::FilePath& service_path,
      const PBTH_LE_GATT_CHARACTERISTIC characteristic,
      PBTH_LE_GATT_CHARACTERISTIC_VALUE new_value) override;
  HRESULT RegisterGattEvents(
      base::FilePath& service_path,
      BTH_LE_GATT_EVENT_TYPE type,
      PVOID event_parameter,
      PFNBLUETOOTH_GATT_EVENT_CALLBACK_CORRECTED callback,
      PVOID context,
      BLUETOOTH_GATT_EVENT_HANDLE* out_handle) override;
  HRESULT UnregisterGattEvent(
      BLUETOOTH_GATT_EVENT_HANDLE event_handle) override;
  HRESULT WriteDescriptorValue(
      base::FilePath& service_path,
      const PBTH_LE_GATT_DESCRIPTOR descriptor,
      PBTH_LE_GATT_DESCRIPTOR_VALUE new_value) override;

  BLEDevice* SimulateBLEDevice(std::string device_name,
                               BLUETOOTH_ADDRESS device_address);
  BLEDevice* GetSimulatedBLEDevice(std::string device_address);
  void RemoveSimulatedBLEDevice(std::string device_address);

  // Note: |parent_service| may be nullptr to indicate a primary service.
  GattService* SimulateGattService(BLEDevice* device,
                                   GattService* parent_service,
                                   const BTH_LE_UUID& uuid);

  // Note: |parent_service| may be nullptr to indicate a primary service.
  void SimulateGattServiceRemoved(BLEDevice* device,
                                  GattService* parent_service,
                                  std::string attribute_handle);

  // Note: |chain_of_att_handle| contains the attribute handles of the services
  // in order from primary service to target service. The last item in
  // |chain_of_att_handle| is the target service's attribute handle.
  GattService* GetSimulatedGattService(
      BLEDevice* device,
      const std::vector<std::string>& chain_of_att_handle);
  GattCharacteristic* SimulateGattCharacterisc(
      std::string device_address,
      GattService* parent_service,
      const BTH_LE_GATT_CHARACTERISTIC& characteristic);
  void SimulateGattCharacteriscRemove(GattService* parent_service,
                                      std::string attribute_handle);
  GattCharacteristic* GetSimulatedGattCharacteristic(
      GattService* parent_service,
      std::string attribute_handle);
  void SimulateGattCharacteristicValue(GattCharacteristic* characteristic,
                                       const std::vector<uint8_t>& value);
  void SimulateCharacteristicValueChangeNotification(
      GattCharacteristic* characteristic);
  void SimulateGattCharacteristicSetNotifyError(
      GattCharacteristic* characteristic,
      HRESULT error);
  void SimulateGattCharacteristicReadError(GattCharacteristic* characteristic,
                                           HRESULT error);
  void SimulateGattCharacteristicWriteError(GattCharacteristic* characteristic,
                                            HRESULT error);
  void RememberCharacteristicForSubsequentAction(GattService* parent_service,
                                                 std::string attribute_handle);
  void SimulateGattDescriptor(std::string device_address,
                              GattCharacteristic* characteristic,
                              const BTH_LE_UUID& uuid);
  void AddObserver(Observer* observer);

 private:
  // Get simulated characteristic by |service_path| and |characteristic| info.
  GattCharacteristic* GetSimulatedGattCharacteristic(
      base::FilePath& service_path,
      const PBTH_LE_GATT_CHARACTERISTIC characteristic);

  // Generate an unique attribute handle on |device_address|.
  USHORT GenerateAUniqueAttributeHandle(std::string device_address);

  // Generate device path for the BLE device with |device_address|.
  base::string16 GenerateBLEDevicePath(std::string device_address);

  // Generate GATT service device path of the service with
  // |service_attribute_handle|. |resident_device_path| is the BLE device this
  // GATT service belongs to.
  base::string16 GenerateGattServiceDevicePath(
      base::string16 resident_device_path,
      USHORT service_attribute_handle);

  // Extract device address from the device |path| generated by
  // GenerateBLEDevicePath or GenerateGattServiceDevicePath.
  base::string16 ExtractDeviceAddressFromDevicePath(base::string16 path);

  // Extract service attribute handles from the |path| generated by
  // GenerateGattServiceDevicePath.
  std::vector<std::string> ExtractServiceAttributeHandlesFromDevicePath(
      base::string16 path);

  // The canonical BLE device address string format is the
  // BluetoothDevice::CanonicalizeAddress.
  std::string BluetoothAddressToCanonicalString(const BLUETOOTH_ADDRESS& btha);

  // Table to store allocated attribute handle for a device.
  BLEAttributeHandleTable attribute_handle_table_;
  BLEDevicesMap simulated_devices_;
  Observer* observer_;
  GattCharacteristicObserverTable gatt_characteristic_observers_;
  GattCharacteristic* remembered_characteristic_;
};

}  // namespace win
}  // namespace device

#endif  // DEVICE_BLUETOOTH_BLUETOOTH_LOW_ENERGY_WIN_FAKE_H_
