// Copyright 2017 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 "device/bluetooth/test/fake_bluetooth.h"

#include <utility>

#include "base/memory/ptr_util.h"
#include "device/bluetooth/bluetooth_adapter_factory.h"
#include "device/bluetooth/public/mojom/test/fake_bluetooth.mojom.h"
#include "mojo/public/cpp/bindings/strong_binding.h"

namespace bluetooth {

using device::BluetoothAdapterFactory;

FakeBluetooth::FakeBluetooth()
    : global_factory_values_(
          BluetoothAdapterFactory::Get().InitGlobalValuesForTesting()) {}
FakeBluetooth::~FakeBluetooth() = default;

// static
void FakeBluetooth::Create(mojom::FakeBluetoothRequest request) {
  mojo::MakeStrongBinding(std::make_unique<FakeBluetooth>(),
                          std::move(request));
}

void FakeBluetooth::SetLESupported(bool supported,
                                   SetLESupportedCallback callback) {
  global_factory_values_->SetLESupported(supported);
  std::move(callback).Run();
}

void FakeBluetooth::SimulateCentral(mojom::CentralState state,
                                    SimulateCentralCallback callback) {
  mojom::FakeCentralPtr fake_central_ptr;
  fake_central_ = base::MakeRefCounted<FakeCentral>(
      state, mojo::MakeRequest(&fake_central_ptr));
  device::BluetoothAdapterFactory::SetAdapterForTesting(fake_central_);
  std::move(callback).Run(std::move(fake_central_ptr));
}

void FakeBluetooth::AllResponsesConsumed(
    AllResponsesConsumedCallback callback) {
  if (fake_central_) {
    std::move(callback).Run(fake_central_->AllResponsesConsumed());
    return;
  }
  std::move(callback).Run(true);
}

}  // namespace bluetooth
