#pragma once

#include "ble.h"

#define UID QBluetoothUuid
#define STR QStringLiteral

#ifdef Q_OS_ANDROID
class QtAndroidService;
#endif
class Connection;

class BLE_ME : public BLE {
  Q_OBJECT

public:
#ifdef Q_OS_ANDROID
  BLE_ME(QtAndroidService*, Connection*);
#else
  BLE_ME(Connection*);
#endif

public Q_SLOTS:
  void setDeviceFilter(const QString& s) { filter = s; }
  void read();
  void write(const QByteArray&);

public:
  static const UID uuid_service;
  static const UID uuid_fromRadio;
  static const UID uuid_fromNum;
  static const UID uuid_toRadio;

  QLowEnergyCharacteristic fromRadio;
  QLowEnergyCharacteristic fromNum;
  QLowEnergyCharacteristic toRadio;

#ifdef Q_OS_ANDROID
  QtAndroidService* emitter = nullptr;
#else
  Connection* emitter = nullptr;
#endif
  Connection* con = nullptr;
  QString filter;
  QLowEnergyDescriptor notifications;

  bool deviceFilter(const QBluetoothDeviceInfo&) override;
  
  void searchCharacteristics();

private Q_SLOTS:
  void ini();
  void serviceStateChanged(QLowEnergyService::ServiceState);
  void characteristicChanged(const QLowEnergyCharacteristic&, const QByteArray&);
  void characteristicRead(const QLowEnergyCharacteristic&, const QByteArray&);
  void characteristicWritten(const QLowEnergyCharacteristic&, const QByteArray&);
  void serviceError(QLowEnergyService::ServiceError);
  void disconnecting();
};
