//
//  Copyright (c) 2018 Open Whisper Systems. All rights reserved.
//

NS_ASSUME_NONNULL_BEGIN

@interface OWSBackupEncryptedItem : NSObject

@property (nonatomic) NSString *filePath;

@property (nonatomic) NSData *encryptionKey;

@end

#pragma mark -

@interface OWSBackupIO : NSObject

- (instancetype)init NS_UNAVAILABLE;

- (instancetype)initWithJobTempDirPath:(NSString *)jobTempDirPath;

- (NSString *)generateTempFilePath;

- (nullable NSString *)createTempFile;

#pragma mark - Encrypt

- (nullable OWSBackupEncryptedItem *)encryptFileAsTempFile:(NSString *)srcFilePath;

- (nullable OWSBackupEncryptedItem *)encryptFileAsTempFile:(NSString *)srcFilePath
                                             encryptionKey:(NSData *)encryptionKey;

- (nullable OWSBackupEncryptedItem *)encryptDataAsTempFile:(NSData *)srcData;

- (nullable OWSBackupEncryptedItem *)encryptDataAsTempFile:(NSData *)srcData encryptionKey:(NSData *)encryptionKey;

#pragma mark - Decrypt

- (BOOL)decryptFileAsFile:(NSString *)srcFilePath
              dstFilePath:(NSString *)dstFilePath
            encryptionKey:(NSData *)encryptionKey;

- (nullable NSData *)decryptFileAsData:(NSString *)srcFilePath encryptionKey:(NSData *)encryptionKey;

- (nullable NSData *)decryptDataAsData:(NSData *)srcData encryptionKey:(NSData *)encryptionKey;

#pragma mark - Compression

- (nullable NSData *)compressData:(NSData *)srcData;

// I'm using the (new in iOS 9) compressionlib.  One of its weaknesses is that it
// requires you to pre-allocate output buffers during compression and decompression.
// During decompression this is particularly tricky since there's no way to safely
// predict how large the output will be based on the input.  So, we store the
// uncompressed size for compressed backup items.
- (nullable NSData *)decompressData:(NSData *)srcData uncompressedDataLength:(NSUInteger)uncompressedDataLength;

@end

NS_ASSUME_NONNULL_END
