(() => {
  function setupHRMAdvertising() {
    /*
     * This function prepares BLE heart rate Advertisement.
     */

    require("ble_advert").set(0x180d, undefined, {
      // We need custom Advertisement settings for Apps like OpenTracks
      connectable: true,
      discoverable: true,
      scannable: true,
      whenConnected: true,
    });

    NRF.setServices({
      0x180D: { // heart_rate
        0x2A37: { // heart_rate_measurement
          notify: true,
          value: [0x06, 0],
        },
        0x2A38: { // Sensor Location: Wrist
          value: 0x02,
        }
      }
    });
  }

  const keepConnected = (require("Storage").readJSON("gatthrm.settings.json", 1) || {}).keepConnected;

  function updateBLEHeartRate(hrm) {
    /*
     * Send updated heart rate measurement via BLE
     */
    if (hrm === undefined || hrm.confidence < 50) return;
    try {
      NRF.updateServices({
        0x180D: {
          0x2A37: {
            value: [0x06, hrm.bpm],
            notify: true
          },
          0x2A38: {
            value: 0x02,
          }
        }
      });
    } catch (error) {
      if (error.message.includes("BLE restart")) {
        /*
         * BLE has to restart after service setup.
         */
        if(!keepConnected)
          NRF.disconnect();
      }
      else if (error.message.includes("UUID 0x2a37")) {
        /*
         * Setup service if it wasn't setup correctly for some reason
         */
        setupHRMAdvertising();
      } else {
        console.log("[bootgatthrm]: Unexpected error occured while updating HRM over BLE! Error: " + error.message);
      }
    }
  }

  setupHRMAdvertising();
  Bangle.on("HRM", updateBLEHeartRate);
})();
