<!DOCTYPE html>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<body>
<button>Click me!</button>
<script>
let device, gatt;

test_driver.set_test_context(parent);

function requestDeviceWithOptionsAndConnect(options) {
  return test_driver.click(document.getElementsByTagName("button")[0])
      .then(() => navigator.bluetooth.requestDevice(options))
      .then(device => device.gatt.connect());
}

window.addEventListener('message', (messageEvent) => {
  switch (messageEvent.data.type) {
    case 'GetAvailability':
      navigator.bluetooth.getAvailability()
          .then(availability => parent.postMessage(availability, '*'))
          .catch(err => parent.postMessage(`FAIL: ${err}`, '*'));
      break;
    case 'GetDevices':
      navigator.bluetooth.getDevices()
          .then(devices => parent.postMessage('Success', '*'))
          .catch(err => parent.postMessage(`FAIL: ${err}`, '*'));
      break;
    case 'RequestDevice':
      test_driver.click(document.getElementsByTagName('button')[0])
          .then(
              () => navigator.bluetooth.requestDevice(
                  {filters: [{services: ['generic_access']}]}))
          .then(device => {
            if (device.constructor.name === 'BluetoothDevice') {
              parent.postMessage('Success', '*');
            } else {
              parent.postMessage(
                  `FAIL: requestDevice in iframe returned ${device.name}`, '*');
            }
          })
          .catch(err => parent.postMessage(`FAIL: ${err.name}: ${err.message}`, '*'));
      break;
    case 'RequestLEScan':
      test_driver.click(document.getElementsByTagName('button')[0])
          .then(
              () => navigator.bluetooth.requestLEScan(
                {filters: [{name: 'Health Thermometer'}]}))
          .then(leScan => {
              if (leScan.active) {
                parent.postMessage('Success', '*');
                leScan.stop();
              } else {
                parent.postMessage(`FAIL: the LE scan hasn't been initiated.`, '*');
              }
          })
          .catch(err => parent.postMessage(`FAIL: ${err.name}: ${err.message}`, '*'));
      break;
    case 'RequestAndConnect':
      requestDeviceWithOptionsAndConnect(messageEvent.data.options)
          .then(_ => {
            gatt = _;
            device = gatt.device;
            parent.postMessage('Connected', '*');
          })
          .catch(err => {
            parent.postMessage(`FAIL: ${err}`, '*');
          });
      break;
    case 'DiscoverServices':
      requestDeviceWithOptionsAndConnect(messageEvent.data.options)
          .then(gatt => gatt.getPrimaryServices())
          .then(() => parent.postMessage('DiscoveryComplete', '*'))
          .catch(err => {
            parent.postMessage(`FAIL: ${err}`, '*');
          });
      break;
    case 'GetService':
      if (typeof gatt === 'undefined') {
        parent.postMessage('FAIL: no GATT server', '*');
        break;
      }
      gatt.getPrimaryService(messageEvent.data.options)
          .then(() => parent.postMessage('ServiceReceived', '*'))
          .catch(err => parent.postMessage(`FAIL: ${err}`, '*'));
      break;
    default:
      parent.postMessage(
          `FAIL: Bad message type: ${messageEvent.data.type}`, '*');
  }
});
</script>
