// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CONTENT_BROWSER_DEVTOOLS_PROTOCOL_BLUETOOTH_EMULATION_HANDLER_H_
#define CONTENT_BROWSER_DEVTOOLS_PROTOCOL_BLUETOOTH_EMULATION_HANDLER_H_

#include "content/browser/devtools/protocol/bluetooth_emulation.h"
#include "content/browser/devtools/protocol/devtools_domain_handler.h"
#include "content/common/content_export.h"
#include "device/bluetooth/bluetooth_adapter_factory.h"
#include "device/bluetooth/public/mojom/emulation/fake_bluetooth.mojom.h"

namespace content::protocol {

// Class that implements the BluetoothEmulation domain, to allow
// configuring virtual Bluetooth devices to test the web-bluetooth API.
// See
// [device/bluetooth/test/README.md](https://chromium.googlesource.com/chromium/src/+/main/device/bluetooth/test/README.md)
class CONTENT_EXPORT BluetoothEmulationHandler
    : public DevToolsDomainHandler,
      public BluetoothEmulation::Backend,
      public bluetooth::mojom::FakeCentralClient {
 public:
  BluetoothEmulationHandler();
  ~BluetoothEmulationHandler() override;

  static std::vector<BluetoothEmulationHandler*> ForAgentHost(
      DevToolsAgentHostImpl* host);

  // DevToolsDomainHandler:
  void Wire(UberDispatcher* dispatcher) override;

 private:
  // BluetoothEmulation::Backend
  Response Enable(const std::string& in_state, bool in_le_supported) override;
  Response Disable() override;
  void SetSimulatedCentralState(
      const std::string& in_state,
      std::unique_ptr<SetSimulatedCentralStateCallback> callback) override;
  void SimulatePreconnectedPeripheral(
      const std::string& in_address,
      const std::string& in_name,
      std::unique_ptr<
          protocol::Array<protocol::BluetoothEmulation::ManufacturerData>>
          in_manufacturer_data,
      std::unique_ptr<protocol::Array<std::string>> in_known_service_uuids,
      std::unique_ptr<SimulatePreconnectedPeripheralCallback> callback)
      override;

  // Simulates an advertisement packet described by |in_entry| being received
  // from a device. If central is currently scanning, the device will appear on
  // the list of discovered devices.
  void SimulateAdvertisement(
      std::unique_ptr<protocol::BluetoothEmulation::ScanEntry> in_entry,
      std::unique_ptr<SimulateAdvertisementCallback> callback) override;

  void SimulateGATTOperationResponse(
      const std::string& in_address,
      const std::string& in_type,
      int in_code,
      std::unique_ptr<SimulateGATTOperationResponseCallback> callback) override;

  void SimulateCharacteristicOperationResponse(
      const std::string& characteristic_id,
      const std::string& in_type,
      int in_code,
      std::optional<Binary> in_data,
      std::unique_ptr<SimulateCharacteristicOperationResponseCallback> callback)
      override;

  void SimulateDescriptorOperationResponse(
      const std::string& descriptor_id,
      const std::string& in_type,
      int in_code,
      std::optional<Binary> in_data,
      std::unique_ptr<SimulateDescriptorOperationResponseCallback> callback)
      override;

  void AddService(const std::string& in_address,
                  const std::string& service_uuid,
                  std::unique_ptr<AddServiceCallback> callback) override;
  void RemoveService(const std::string& service_id,
                     std::unique_ptr<RemoveServiceCallback> callback) override;

  void AddCharacteristic(
      const std::string& service_id,
      const std::string& in_characteristicUuid,
      std::unique_ptr<protocol::BluetoothEmulation::CharacteristicProperties>
          in_properties,
      std::unique_ptr<AddCharacteristicCallback> callback) override;
  void RemoveCharacteristic(
      const std::string& characteristic_id,
      std::unique_ptr<RemoveCharacteristicCallback> callback) override;
  void AddDescriptor(const std::string& characteristic_id,
                     const std::string& descriptor_uuid,
                     std::unique_ptr<AddDescriptorCallback> callback) override;
  void RemoveDescriptor(
      const std::string& in_descriptorId,
      std::unique_ptr<RemoveDescriptorCallback> callback) override;
  void SimulateGATTDisconnection(
      const std::string& address,
      std::unique_ptr<SimulateGATTDisconnectionCallback> callback) override;

  // bluetooth::mojom::FakeCentralClient
  void DispatchGATTOperationEvent(
      bluetooth::mojom::GATTOperationType type,
      const std::string& peripheral_address) override;
  void DispatchCharacteristicOperationEvent(
      bluetooth::mojom::CharacteristicOperationType type,
      const std::optional<std::vector<uint8_t>>& data,
      const std::optional<bluetooth::mojom::WriteType> write_type,
      const std::string& characteristic_id) override;
  void DispatchDescriptorOperationEvent(
      bluetooth::mojom::DescriptorOperationType type,
      const std::optional<std::vector<uint8_t>>& data,
      const std::string& descriptor_id) override;

  bool is_enabled() { return fake_central_.is_bound(); }

  std::optional<BluetoothEmulation::Frontend> frontend_;
  // Tracks emulation usage across all instances, since the backend can only
  // support one fake adapter at a time.
  inline static bool emulation_enabled_ = false;
  mojo::Remote<bluetooth::mojom::FakeCentral> fake_central_;
  mojo::AssociatedReceiver<bluetooth::mojom::FakeCentralClient>
      client_receiver_{this};
  std::unique_ptr<device::BluetoothAdapterFactory::GlobalOverrideValues>
      global_factory_values_;
};

}  // namespace content::protocol

#endif  // CONTENT_BROWSER_DEVTOOLS_PROTOCOL_BLUETOOTH_EMULATION_HANDLER_H_
