//
//  RTKOTAPeripheral.h
//  RTKOTASDK
//
//  Created by jerome_gu on 2019/4/16.
//  Copyright © 2019 Realtek. All rights reserved.
//

#ifdef RTK_SDK_IS_STATIC_LIBRARY
#import "libRTKLEFoundation.h"
#import "RTKOTAInstalledBin.h"
#else
#import <RTKLEFoundation/RTKLEFoundation.h>
#import <RTKOTASDK/RTKOTAInstalledBin.h>
#endif


NS_ASSUME_NONNULL_BEGIN


typedef enum : NSUInteger {
    RTKOTAProtocolTypeGATTSPP  =  0x0000,
    RTKOTAProtocolTypeGATT  =   0x0010,
    RTKOTAProtocolTypeSPP =   0x0011,
} RTKOTAProtocolType;


/**
 * Represents the ear bud information about the remote device.
 */
typedef enum : NSUInteger {
    RTKOTAEarbudUnkown,     ///< The earbud info is not known.
    RTKOTAEarbudPrimary,    ///< The earbud is primary bud.
    RTKOTAEarbudSecondary,  ///< The earbud is secondary bud.
    RTKOTAEarbudSingle,     ///< The earbud is a single bud.
} RTKOTAEarbud;


/**
 * Represents the bank info about the remote device.
 */
typedef enum : NSInteger {
    RTKOTABankTypeInvalid   =   -1, ///< The bank info is not valid.
    RTKOTABankTypeSingle    = 0x00, ///< A single bank.
    RTKOTABankTypeBank0,            ///< The primary Bank in a dual bank case.
    RTKOTABankTypeBank1,            ///< The secondary Bank in a dual bank case.
} RTKOTABankType;


@class RTKOTAPeripheral;

/**
 * @protocol RTKOTAPeripheralDelegate
 *
 * RTKOTAPeripheralDelegate define methods to notify information determination event.
 */
@protocol RTKOTAPeripheralDelegate <RTKLEPeripheralDelegate>

/**
 * Invoked when RTKOTAClient has determined information about OTA.
 */
- (void)OTAPeripheral:(RTKOTAPeripheral *)peripheral didDetermineInfoWithError:(nullable NSError*)error;

@end


/**
 * @class RTKOTAPeripheral
 *
 * Represents a remote LE device, exposing OTA upgrade related information.
 *
 * @discussion An RTKOTAPeripheral object gives your app information about a LE device which is able for DFU upgrade. You can use the information in this class to determine whether your app can start a normal DFU upgrade or a silent DFU upgrade, and have a knowlege of which feature the device support.
 *
 * The class does not provide any methods to start upgrade, it's a responsibility of a DFUPeripehral object. You call -[RTKOTAProfile translatePeripheral:toDFUPeripheralWithCompletion:] to get a DFUPeripheral for normal upgrade, and call -[RTKOTAProfile DFUPeripheralOfOTAPeripheral:] to get a DFUPeripheral for silent upgrade.
 */
@interface RTKOTAPeripheral : RTKLEPeripheral


/**
 * Indicates if the remote device information has determined.
 *
 * @discussion Other APIs should not be called if the value is NO. A success connection by call <code>-[RTKOTAProfile connectTo:]</code> will set this value to YES.
 */
@property (readonly) BOOL infoSettled;

/// Not available
@property (readonly) BOOL isBBpro;

/**
 * The delegate object specified to receive peripheral events.
 */
@property (nonatomic, weak) id <RTKOTAPeripheralDelegate> delegate;

/// The version number which the remote device implemented.
@property (readonly) NSUInteger OTAVersion;

/// @warning Not available
@property (readonly) NSUInteger securityVersion;

/**
 * The @b BDAddress of this device.
 */
@property (readonly) BDAddressType bdAddress;

/**
 * The @b BDAddress of the companion device.
 *
 * @discussion If the remote device have a companion device, this value return the companion device @b BDAddress. If does not, return a zero value.
 */
@property (readonly) BDAddressType pairedBDAddress;

/// The version of Application image type in remote device.
/// @warning Not available in newer implementation.
@property (readonly) uint16_t appVersion;

/// The version of Patch image type in remote device.
/// @warning Not available in newer implementation.
@property (readonly) uint16_t patchVersion;

/// The Link Key of the LE Connection with remote device.
/// @warning Not available in newer implementation.
@property (readonly, nullable) NSString *linkKey;

/// The memory size used for temp buffer.
@property (readonly) NSUInteger tempBufferSize;

/// The bank used currently.
/// @discussion Return @b RTKOTABankTypeBank0 or @b RTKOTABankTypeBank1 when dual-bank feature is supported, otherwise @b RTKOTABankTypeSingle is returned.
@property (readonly) RTKOTABankType activeBank;

/// The used bank of Application image type in remote device.
/// @warning Not available in newer implementation.
@property (readonly) NSUInteger appFreeBank;

/// The used bank of Application image type in remote device.
/// @warning Not available in newer implementation.
@property (readonly) NSUInteger patchFreeBank;

/// Indicates whether buffer check is supported on the remote device .
@property (readonly) BOOL bufferCheckEnable;

/// Indicates whether AES encryption is supported on the remote device .
@property (readonly) BOOL AESEnable;

/// The encryption mode used in the remoter device..
@property (readonly) NSUInteger encryptionMode;

/// Indicate whether Copy image is supported.
@property (readonly) BOOL copyImage;

/// Indicate whether Upgrade multiple images is supported.
@property (readonly) BOOL updateMultiImages;

/// Indicates whether this peripheral is a one bud of RWS bud
@property (readonly) BOOL isRWS;

/// Indicates which bud type the remote device is.
@property (readonly) RTKOTAEarbud budType;

/// Indicates whether the device is in engaged with companion device.
@property (readonly) BOOL notEngaged;

/// Indicate whether this peripheral have received images right now, but not active.
@property (readonly) BOOL upgradedCurrently;

/// For SDK internal use.
@property (readonly) uint32_t imageIndicator;

/// For SDK internal use.
@property (readonly) RTKOTAProtocolType protocolType;


/**
 * A list of image binarys resides in remote device.
 *
 * @discussion Use this property to get  a knowledge of binarys installed in the device, such as image type and version.
 */
@property (readonly) NSArray <RTKOTAInstalledBin*> *bins;

/**
 * Indicates whether the device can upgrade using normal upgrade procedure.
 *
 * @discussion If this value is YES, call @b -enterOTAMode to make the device transition to a running mode dedicated to Upgrade.
 */
@property (readonly) BOOL canEnterOTAMode;

/**
 * Indicates whether the device can upgrade using silent upgrade procedure.
 *
 * @discussion If this value is YES, DFU upgrade can be start in current runing mode.  Call @b -[RTKOTAProfile @b DFUPeripheralOfOTAPeripheral] to obtain a DFUPeripheral instance for Upgrade.
 */
@property (readonly) BOOL canUpgradeSliently;


/**
 * Request peripheral to make a transition to OTA runing mode.
 *
 * @discussion Typically,  you should not call this method to start a transition. Instead, call @b -[RTKOTAProfile @b translatePeripheral:toDFUPeripheralWithCompletion:] to start the transition.
 */
- (void)enterOTAMode;

@end



@interface RTKOTAPeripheral (DualBank)

/**
 * A list of inactive image binarys resides in remote device.
 *
 * @discussion inactiveBins containing a list of images which is not in use currently.
 */
@property (readonly, nullable) NSArray <RTKOTAInstalledBin*> *inactiveBins;

@end


NS_ASSUME_NONNULL_END