// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#import "FIAPPaymentQueueDelegate.h"
#import "FIAObjectTranslator.h"

@interface FIAPPaymentQueueDelegate ()

@property(strong, nonatomic, readonly) FlutterMethodChannel *callbackChannel;

@end

@implementation FIAPPaymentQueueDelegate

- (id)initWithMethodChannel:(FlutterMethodChannel *)methodChannel {
  self = [super init];
  if (self) {
    _callbackChannel = methodChannel;
  }

  return self;
}

- (BOOL)paymentQueue:(SKPaymentQueue *)paymentQueue
    shouldContinueTransaction:(SKPaymentTransaction *)transaction
                 inStorefront:(SKStorefront *)newStorefront {
  // Default return value for this method is true (see
  // https://developer.apple.com/documentation/storekit/skpaymentqueuedelegate/3521328-paymentqueueshouldshowpriceconse?language=objc)
  __block BOOL shouldContinue = YES;
  dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
  [self.callbackChannel invokeMethod:@"shouldContinueTransaction"
                           arguments:[FIAObjectTranslator getMapFromSKStorefront:newStorefront
                                                         andSKPaymentTransaction:transaction]
                              result:^(id _Nullable result) {
                                // When result is a valid instance of NSNumber use it to determine
                                // if the transaction should continue. Otherwise use the default
                                // value.
                                if (result && [result isKindOfClass:[NSNumber class]]) {
                                  shouldContinue = [(NSNumber *)result boolValue];
                                }

                                dispatch_semaphore_signal(semaphore);
                              }];

  // The client should respond within 1 second otherwise continue
  // with default value.
  dispatch_semaphore_wait(semaphore, dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC));

  return shouldContinue;
}

#if TARGET_OS_IOS
- (BOOL)paymentQueueShouldShowPriceConsent:(SKPaymentQueue *)paymentQueue {
  // Default return value for this method is true (see
  // https://developer.apple.com/documentation/storekit/skpaymentqueuedelegate/3521328-paymentqueueshouldshowpriceconse?language=objc)
  __block BOOL shouldShowPriceConsent = YES;
  dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
  [self.callbackChannel invokeMethod:@"shouldShowPriceConsent"
                           arguments:nil
                              result:^(id _Nullable result) {
                                // When result is a valid instance of NSNumber use it to determine
                                // if the transaction should continue. Otherwise use the default
                                // value.
                                if (result && [result isKindOfClass:[NSNumber class]]) {
                                  shouldShowPriceConsent = [(NSNumber *)result boolValue];
                                }

                                dispatch_semaphore_signal(semaphore);
                              }];

  // The client should respond within 1 second otherwise continue
  // with default value.
  dispatch_semaphore_wait(semaphore, dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC));

  return shouldShowPriceConsent;
}
#endif

@end
