// 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.

#include "modules/bluetooth/BluetoothAttributeInstanceMap.h"

#include "modules/bluetooth/BluetoothDevice.h"
#include "modules/bluetooth/BluetoothRemoteGATTService.h"
#include <memory>
#include <utility>

namespace blink {

BluetoothAttributeInstanceMap::BluetoothAttributeInstanceMap(
    BluetoothDevice* device)
    : m_device(device) {}

BluetoothRemoteGATTService*
BluetoothAttributeInstanceMap::getOrCreateRemoteGATTService(
    mojom::blink::WebBluetoothRemoteGATTServicePtr remoteGATTService,
    bool isPrimary,
    const String& deviceInstanceId) {
  String serviceInstanceId = remoteGATTService->instance_id;
  BluetoothRemoteGATTService* service =
      m_serviceIdToObject.get(serviceInstanceId);

  if (!service) {
    service = new BluetoothRemoteGATTService(
        std::move(remoteGATTService), isPrimary, deviceInstanceId, m_device);
    m_serviceIdToObject.add(serviceInstanceId, service);
  }

  return service;
}

bool BluetoothAttributeInstanceMap::containsService(
    const String& serviceInstanceId) {
  return m_serviceIdToObject.contains(serviceInstanceId);
}

BluetoothRemoteGATTCharacteristic*
BluetoothAttributeInstanceMap::getOrCreateRemoteGATTCharacteristic(
    ExecutionContext* context,
    mojom::blink::WebBluetoothRemoteGATTCharacteristicPtr
        remoteGATTCharacteristic,
    BluetoothRemoteGATTService* service) {
  String instanceId = remoteGATTCharacteristic->instance_id;
  BluetoothRemoteGATTCharacteristic* characteristic =
      m_characteristicIdToObject.get(instanceId);

  if (!characteristic) {
    characteristic = BluetoothRemoteGATTCharacteristic::create(
        context, std::move(remoteGATTCharacteristic), service, m_device);
    m_characteristicIdToObject.add(instanceId, characteristic);
  }

  return characteristic;
}

bool BluetoothAttributeInstanceMap::containsCharacteristic(
    const String& characteristicInstanceId) {
  return m_characteristicIdToObject.contains(characteristicInstanceId);
}

BluetoothRemoteGATTDescriptor*
BluetoothAttributeInstanceMap::getOrCreateBluetoothRemoteGATTDescriptor(
    mojom::blink::WebBluetoothRemoteGATTDescriptorPtr descriptor,
    BluetoothRemoteGATTCharacteristic* characteristic) {
  String instanceId = descriptor->instance_id;
  BluetoothRemoteGATTDescriptor* result =
      m_descriptorIdToObject.get(instanceId);

  if (result)
    return result;

  result =
      new BluetoothRemoteGATTDescriptor(std::move(descriptor), characteristic);
  m_descriptorIdToObject.add(instanceId, result);
  return result;
}

bool BluetoothAttributeInstanceMap::containsDescriptor(
    const String& descriptorInstanceId) {
  return m_descriptorIdToObject.contains(descriptorInstanceId);
}

void BluetoothAttributeInstanceMap::Clear() {
  m_serviceIdToObject.clear();
  m_characteristicIdToObject.clear();
  m_descriptorIdToObject.clear();
}

DEFINE_TRACE(BluetoothAttributeInstanceMap) {
  visitor->trace(m_device);
  visitor->trace(m_serviceIdToObject);
  visitor->trace(m_characteristicIdToObject);
  visitor->trace(m_descriptorIdToObject);
}

}  // namespace blink
