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

#include "device/bluetooth/dbus/bluetooth_dbus_client_bundle.h"

#include <memory>
#include <vector>

#include "base/command_line.h"
#include "base/logging.h"
#include "base/strings/string_split.h"
#include "base/strings/string_util.h"
#include "chromeos/constants/chromeos_features.h"
#include "device/bluetooth/dbus/bluetooth_adapter_client.h"
#include "device/bluetooth/dbus/bluetooth_admin_policy_client.h"
#include "device/bluetooth/dbus/bluetooth_advertisement_monitor_manager_client.h"
#include "device/bluetooth/dbus/bluetooth_agent_manager_client.h"
#include "device/bluetooth/dbus/bluetooth_battery_client.h"
#include "device/bluetooth/dbus/bluetooth_debug_manager_client.h"
#include "device/bluetooth/dbus/bluetooth_device_client.h"
#include "device/bluetooth/dbus/bluetooth_gatt_characteristic_client.h"
#include "device/bluetooth/dbus/bluetooth_gatt_descriptor_client.h"
#include "device/bluetooth/dbus/bluetooth_gatt_manager_client.h"
#include "device/bluetooth/dbus/bluetooth_gatt_service_client.h"
#include "device/bluetooth/dbus/bluetooth_input_client.h"
#include "device/bluetooth/dbus/bluetooth_le_advertising_manager_client.h"
#include "device/bluetooth/dbus/bluetooth_profile_manager_client.h"
#include "device/bluetooth/dbus/fake_bluetooth_adapter_client.h"
#include "device/bluetooth/dbus/fake_bluetooth_admin_policy_client.h"
#include "device/bluetooth/dbus/fake_bluetooth_advertisement_monitor_manager_client.h"
#include "device/bluetooth/dbus/fake_bluetooth_agent_manager_client.h"
#include "device/bluetooth/dbus/fake_bluetooth_battery_client.h"
#include "device/bluetooth/dbus/fake_bluetooth_debug_manager_client.h"
#include "device/bluetooth/dbus/fake_bluetooth_device_client.h"
#include "device/bluetooth/dbus/fake_bluetooth_gatt_characteristic_client.h"
#include "device/bluetooth/dbus/fake_bluetooth_gatt_descriptor_client.h"
#include "device/bluetooth/dbus/fake_bluetooth_gatt_manager_client.h"
#include "device/bluetooth/dbus/fake_bluetooth_gatt_service_client.h"
#include "device/bluetooth/dbus/fake_bluetooth_input_client.h"
#include "device/bluetooth/dbus/fake_bluetooth_le_advertising_manager_client.h"
#include "device/bluetooth/dbus/fake_bluetooth_profile_manager_client.h"

namespace bluez {

BluetoothDBusClientBundle::BluetoothDBusClientBundle(bool use_fakes)
    : use_fakes_(use_fakes) {
  if (!use_fakes_) {
    bluetooth_adapter_client_.reset(BluetoothAdapterClient::Create());
    bluetooth_admin_policy_client_ = BluetoothAdminPolicyClient::Create();
    bluetooth_le_advertising_manager_client_.reset(
        BluetoothLEAdvertisingManagerClient::Create());
#if BUILDFLAG(IS_CHROMEOS)
    bluetooth_advertisement_monitor_manager_client_ =
        BluetoothAdvertisementMonitorManagerClient::Create();
#endif  // BUILDFLAG(IS_CHROMEOS)
    bluetooth_agent_manager_client_.reset(
        BluetoothAgentManagerClient::Create());
    bluetooth_battery_client_.reset(BluetoothBatteryClient::Create());
    bluetooth_debug_manager_client_.reset(
        BluetoothDebugManagerClient::Create());
    bluetooth_device_client_.reset(BluetoothDeviceClient::Create());
    bluetooth_input_client_.reset(BluetoothInputClient::Create());
    bluetooth_profile_manager_client_.reset(
        BluetoothProfileManagerClient::Create());
    bluetooth_gatt_characteristic_client_.reset(
        BluetoothGattCharacteristicClient::Create());
    bluetooth_gatt_descriptor_client_.reset(
        BluetoothGattDescriptorClient::Create());
    bluetooth_gatt_manager_client_.reset(BluetoothGattManagerClient::Create());
    bluetooth_gatt_service_client_.reset(BluetoothGattServiceClient::Create());

    alternate_bluetooth_adapter_client_.reset(BluetoothAdapterClient::Create());
    alternate_bluetooth_admin_policy_client_ =
        BluetoothAdminPolicyClient::Create();
    alternate_bluetooth_device_client_.reset(BluetoothDeviceClient::Create());
  } else {
#if defined(USE_REAL_DBUS_CLIENTS)
    LOG(FATAL) << "Fakes are unavailable if USE_REAL_DBUS_CLIENTS is defined.";
#else
    bluetooth_adapter_client_ = std::make_unique<FakeBluetoothAdapterClient>();
    bluetooth_admin_policy_client_ =
        std::make_unique<FakeBluetoothAdminPolicyClient>();
    bluetooth_le_advertising_manager_client_ =
        std::make_unique<FakeBluetoothLEAdvertisingManagerClient>();
#if BUILDFLAG(IS_CHROMEOS)
    bluetooth_advertisement_monitor_manager_client_ =
        std::make_unique<FakeBluetoothAdvertisementMonitorManagerClient>();
#endif  // BUILDFLAG(IS_CHROMEOS)
    bluetooth_agent_manager_client_ =
        std::make_unique<FakeBluetoothAgentManagerClient>();
    bluetooth_battery_client_ = std::make_unique<FakeBluetoothBatteryClient>();
    bluetooth_debug_manager_client_ =
        std::make_unique<FakeBluetoothDebugManagerClient>();
    bluetooth_device_client_ = std::make_unique<FakeBluetoothDeviceClient>();
    bluetooth_input_client_ = std::make_unique<FakeBluetoothInputClient>();
    bluetooth_profile_manager_client_ =
        std::make_unique<FakeBluetoothProfileManagerClient>();
    bluetooth_gatt_characteristic_client_ =
        std::make_unique<FakeBluetoothGattCharacteristicClient>();
    bluetooth_gatt_descriptor_client_ =
        std::make_unique<FakeBluetoothGattDescriptorClient>();
    bluetooth_gatt_manager_client_ =
        std::make_unique<FakeBluetoothGattManagerClient>();
    bluetooth_gatt_service_client_ =
        std::make_unique<FakeBluetoothGattServiceClient>();

    alternate_bluetooth_adapter_client_ =
        std::make_unique<FakeBluetoothAdapterClient>();
    alternate_bluetooth_admin_policy_client_ =
        std::make_unique<FakeBluetoothAdminPolicyClient>();
    alternate_bluetooth_device_client_ =
        std::make_unique<FakeBluetoothDeviceClient>();
#endif  // defined(USE_REAL_DBUS_CLIENTS)
  }
}

BluetoothDBusClientBundle::~BluetoothDBusClientBundle() = default;

}  // namespace bluez