// 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 "device/bluetooth/bluetooth_classic_win_fake.h"

#include "base/logging.h"

namespace device {
namespace win {

BluetoothClassicWrapperFake::BluetoothClassicWrapperFake()
    : last_error_(ERROR_SUCCESS) {}
BluetoothClassicWrapperFake::~BluetoothClassicWrapperFake() {}

HBLUETOOTH_RADIO_FIND BluetoothClassicWrapperFake::FindFirstRadio(
    const BLUETOOTH_FIND_RADIO_PARAMS* params) {
  if (simulated_radios_) {
    last_error_ = ERROR_SUCCESS;
    return (PVOID)simulated_radios_.get();
  }
  last_error_ = ERROR_NO_MORE_ITEMS;
  return NULL;
}

DWORD BluetoothClassicWrapperFake::GetRadioInfo(
    PBLUETOOTH_RADIO_INFO out_radio_info) {
  if (simulated_radios_) {
    *out_radio_info = simulated_radios_->radio_info;
    last_error_ = ERROR_SUCCESS;
    return last_error_;
  }
  last_error_ = ERROR_INVALID_HANDLE;
  return last_error_;
}

BOOL BluetoothClassicWrapperFake::FindRadioClose(HBLUETOOTH_RADIO_FIND handle) {
  DCHECK_EQ(handle, (PVOID)simulated_radios_.get());
  return TRUE;
}

BOOL BluetoothClassicWrapperFake::IsConnectable() {
  if (simulated_radios_) {
    last_error_ = ERROR_SUCCESS;
    return simulated_radios_->is_connectable;
  }
  last_error_ = ERROR_INVALID_HANDLE;
  return FALSE;
}

HBLUETOOTH_DEVICE_FIND BluetoothClassicWrapperFake::FindFirstDevice(
    const BLUETOOTH_DEVICE_SEARCH_PARAMS* params,
    BLUETOOTH_DEVICE_INFO* out_device_info) {
  last_error_ = ERROR_NO_MORE_ITEMS;
  return NULL;
}

BOOL BluetoothClassicWrapperFake::FindNextDevice(
    HBLUETOOTH_DEVICE_FIND handle,
    BLUETOOTH_DEVICE_INFO* out_device_info) {
  NOTIMPLEMENTED();
  return TRUE;
}

BOOL BluetoothClassicWrapperFake::FindDeviceClose(
    HBLUETOOTH_DEVICE_FIND handle) {
  return TRUE;
}

BOOL BluetoothClassicWrapperFake::EnableDiscovery(BOOL is_enable) {
  return TRUE;
}

BOOL BluetoothClassicWrapperFake::EnableIncomingConnections(BOOL is_enable) {
  return TRUE;
}

DWORD BluetoothClassicWrapperFake::LastError() {
  return last_error_;
}

bool BluetoothClassicWrapperFake::HasHandle() {
  return bool(simulated_radios_);
}

BluetoothRadio* BluetoothClassicWrapperFake::SimulateARadio(
    base::string16 name,
    BLUETOOTH_ADDRESS address) {
  BluetoothRadio* radio = new BluetoothRadio();
  radio->is_connectable = true;  // set it connectable by default.
  size_t length =
      ((name.size() > BLUETOOTH_MAX_NAME_SIZE) ? BLUETOOTH_MAX_NAME_SIZE
                                               : name.size());
  wcsncpy(radio->radio_info.szName, name.c_str(), length);
  radio->radio_info.address = address;
  simulated_radios_.reset(radio);
  return radio;
}
}  // namespace device
}  // namespace win
