//
//  ADJEvent.h
//  adjust
//
//  Created by Pedro Filipe on 15/10/14.
//  Copyright (c) 2014 adjust GmbH. All rights reserved.
//

#import <Foundation/Foundation.h>

/**
 * @brief Adjust event class.
 */
@interface ADJEvent : NSObject<NSCopying>

/**
 * @brief Revenue attached to the event.
 */
@property (nonatomic, copy, readonly, nonnull) NSNumber *revenue;

/**
 * @brief Event token.
 */
@property (nonatomic, copy, readonly, nonnull) NSString *eventToken;

/**
 * @brief IAP transaction ID.
 */
@property (nonatomic, copy, readonly, nonnull) NSString *transactionId;

/**
 * @brief Custom user defined event ID.
 */
@property (nonatomic, copy, readonly, nonnull) NSString *callbackId;

/**
 * @brief Currency value.
 */
@property (nonatomic, copy, readonly, nonnull) NSString *currency;

/**
 * @brief IAP receipt.
 */
@property (nonatomic, copy, readonly, nonnull) NSData *receipt;

/**
 * @brief List of partner parameters.
 */
@property (nonatomic, readonly, nonnull) NSDictionary *partnerParameters;

/**
 * @brief List of callback parameters.
 */
@property (nonatomic, readonly, nonnull) NSDictionary *callbackParameters;

/**
 * @brief Is the given receipt empty.
 */
@property (nonatomic, assign, readonly) BOOL emptyReceipt;

/**
 * @brief IAP product ID.
 */
@property (nonatomic, copy, readonly, nonnull) NSString *productId;

/**
 * @brief Create Event object with event token.
 *
 * @param eventToken Event token that is created in the dashboard
 *                   at http://adjust.com and should be six characters long.
 */
+ (nullable ADJEvent *)eventWithEventToken:(nonnull NSString *)eventToken;

- (nullable id)initWithEventToken:(nonnull NSString *)eventToken;

/**
 * @brief Add a key-pair to a callback URL.
 *
 * @param key String key in the callback URL.
 * @param value String value of the key in the Callback URL.
 *
 * @note In your dashboard at http://adjust.com you can assign a callback URL to each
 *       event type. That URL will get called every time the event is triggered. On
 *       top of that you can add callback parameters to the following method that
 *       will be forwarded to these callbacks.
 */
- (void)addCallbackParameter:(nonnull NSString *)key value:(nonnull NSString *)value;

/**
 * @brief Add a key-pair to be fowarded to a partner.
 *
 * @param key String key to be fowarded to the partner.
 * @param value String value of the key to be fowarded to the partner.
 */
- (void)addPartnerParameter:(nonnull NSString *)key value:(nonnull NSString *)value;

/**
 * @brief Set the revenue and associated currency of the event.
 *
 * @param amount The amount in units (example: for 1.50 EUR is 1.5).
 * @param currency String of the currency with ISO 4217 format.
 *                 It should be 3 characters long (example: for 1.50 EUR is @"EUR").
 *
 * @note The event can contain some revenue. The amount revenue is measured in units.
 *       It must include a currency in the ISO 4217 format.
 */
- (void)setRevenue:(double)amount currency:(nonnull NSString *)currency;

/**
 * @brief Set the transaction ID of a In-App Purchases to avoid revenue duplications.
 *
 * @note A transaction ID can be used to avoid duplicate revenue events. The last ten
 *       transaction identifiers are remembered.
 *
 * @param transactionId The identifier used to avoid duplicate revenue events.
 */
- (void)setTransactionId:(nonnull NSString *)transactionId;

/**
 * @brief Set the custom user defined ID for the event which will be reported in
 *        success/failure callbacks.
 *
 * @param callbackId Custom user defined identifier for the event
 */
- (void)setCallbackId:(nonnull NSString *)callbackId;

/**
 * @brief Set the product ID of a In-App Purchases to perform IAP verification.
 *
 * @param productId The product ID of the purchased item.
 */
- (void)setProductId:(NSString * _Nonnull)productId;

/**
 * @brief Set the receipt of a In-App Purchases to perform IAP verification.
 *
 * @param receipt The receipt obtained after successful IAP.
 */
- (void)setReceipt:(NSData * _Nonnull)receipt;

/**
 * @brief Check if created adjust event object is valid.
 *
 * @return Boolean indicating whether the adjust event object is valid or not.
 */
- (BOOL)isValid;

/**
 * @brief Validate a in-app-purchase receipt.
 *
 * @param receipt The receipt to validate.
 * @param transactionId The identifier used to validate the receipt and to avoid duplicate revenue events.
 *
 * @note This method is obsolete and should not be used.
 *       For more information, visit: https://github.com/adjust/ios_purchase_sdk
 */
- (void)setReceipt:(nonnull NSData *)receipt transactionId:(nonnull NSString *)transactionId;

@end
