//
//  Device.h
//  CIDPrinterLibrary
//
//  Created by Uwe Hoppe on 18.11.21.
//

#ifndef Device_h
#define Device_h

#import "BluetoothManager.h"

extern NSString * const cDeviceDidConnect;
extern NSString * const cDeviceDidDisconnect;
extern NSString * const cDeviceConnectionErrorDomain;
extern const NSInteger cConnectionTimeoutErrorCode;
extern const NSInteger cConnectionMissingErrorCode;
extern NSString * const cConnectionTimeoutErrorMessage;
extern NSString * const cConnectionMissingErrorMessage;

typedef void(^DeviceConnectionCallback)(NSError *error);
typedef void(^DeviceDiscoverServicesCallback)(NSArray *services, NSError *error);
typedef void(^DeviceRSSIValueCallback)(NSNumber *RSSI, NSError *error);

@import CoreBluetooth;

@interface Device : NSObject

@property (weak, nonatomic, getter = uuid) NSString *uuid;
@property (weak, nonatomic, getter = getName) NSString *devicename;
@property (weak, nonatomic, readonly) NSString *address;
@property (assign, nonatomic) NSInteger rssi;
@property (strong, nonatomic) NSDictionary *data;
@property (strong, nonatomic, readonly) CBPeripheral *peripheral;
@property (strong, nonatomic, readonly) BluetoothManager *manager;
@property (assign, nonatomic) BOOL discoveringservices;

@property (assign, nonatomic, readonly) BOOL watchDogRaised;
@property (assign, nonatomic, readonly, getter = isDiscoveringServices) BOOL discoveringServices;
@property (strong, nonatomic, readonly) NSArray *services;
@property (strong, nonatomic) NSDictionary *advertisingData;

- (void)connectWithCallback:(DeviceConnectionCallback)callback;
- (void)connectWithTimeout:(NSUInteger)aWatchDogInterval callback:(DeviceConnectionCallback)callback;
- (void)disconnectWithCallback:(DeviceConnectionCallback)callback;
- (void)discoverServicesWithCallback:(DeviceDiscoverServicesCallback)callback;
- (void)discoverServices:(NSArray *)serviceUUIDs callback:(DeviceDiscoverServicesCallback)callback;
- (void)readRSSIValueCallback:(DeviceRSSIValueCallback)callback;
- (void)handleConnectWithError:(NSError *)error;
- (void)handleDisconnectWithError:(NSError *)error;

-(id) initWithPeripheral:(CBPeripheral*)peripheral manager:(BluetoothManager*)manager;
-(NSDictionary*) getJSONObject;

@end

#endif /* Device_h */
