//! This file has been automatically generated by `objc2`'s `header-translator`.
//! DO NOT EDIT
use crate::common::*;
use crate::AppKit::*;
use crate::Foundation::*;
use crate::StoreKit::*;

extern_class!(
    #[derive(Debug, PartialEq, Eq, Hash)]
    #[cfg(feature = "StoreKit_SKPaymentQueue")]
    pub struct SKPaymentQueue;

    #[cfg(feature = "StoreKit_SKPaymentQueue")]
    unsafe impl ClassType for SKPaymentQueue {
        type Super = NSObject;
        type Mutability = InteriorMutable;
    }
);

#[cfg(feature = "StoreKit_SKPaymentQueue")]
unsafe impl NSObjectProtocol for SKPaymentQueue {}

extern_methods!(
    #[cfg(feature = "StoreKit_SKPaymentQueue")]
    unsafe impl SKPaymentQueue {
        #[method_id(@__retain_semantics Other delegate)]
        pub unsafe fn delegate(&self) -> Option<Id<ProtocolObject<dyn SKPaymentQueueDelegate>>>;

        #[method(setDelegate:)]
        pub unsafe fn setDelegate(
            &self,
            delegate: Option<&ProtocolObject<dyn SKPaymentQueueDelegate>>,
        );

        #[cfg(feature = "StoreKit_SKStorefront")]
        #[method_id(@__retain_semantics Other storefront)]
        pub unsafe fn storefront(&self) -> Option<Id<SKStorefront>>;

        #[method_id(@__retain_semantics Other defaultQueue)]
        pub unsafe fn defaultQueue() -> Id<Self>;

        #[method(canMakePayments)]
        pub unsafe fn canMakePayments() -> bool;

        #[cfg(feature = "StoreKit_SKPayment")]
        #[method(addPayment:)]
        pub unsafe fn addPayment(&self, payment: &SKPayment);

        #[method(restoreCompletedTransactions)]
        pub unsafe fn restoreCompletedTransactions(&self);

        #[cfg(feature = "Foundation_NSString")]
        #[method(restoreCompletedTransactionsWithApplicationUsername:)]
        pub unsafe fn restoreCompletedTransactionsWithApplicationUsername(
            &self,
            username: Option<&NSString>,
        );

        #[cfg(feature = "StoreKit_SKPaymentTransaction")]
        #[method(finishTransaction:)]
        pub unsafe fn finishTransaction(&self, transaction: &SKPaymentTransaction);

        #[cfg(all(feature = "Foundation_NSArray", feature = "StoreKit_SKDownload"))]
        #[deprecated = "Hosted content is no longer supported"]
        #[method(startDownloads:)]
        pub unsafe fn startDownloads(&self, downloads: &NSArray<SKDownload>);

        #[cfg(all(feature = "Foundation_NSArray", feature = "StoreKit_SKDownload"))]
        #[deprecated = "Hosted content is no longer supported"]
        #[method(pauseDownloads:)]
        pub unsafe fn pauseDownloads(&self, downloads: &NSArray<SKDownload>);

        #[cfg(all(feature = "Foundation_NSArray", feature = "StoreKit_SKDownload"))]
        #[deprecated = "Hosted content is no longer supported"]
        #[method(resumeDownloads:)]
        pub unsafe fn resumeDownloads(&self, downloads: &NSArray<SKDownload>);

        #[cfg(all(feature = "Foundation_NSArray", feature = "StoreKit_SKDownload"))]
        #[deprecated = "Hosted content is no longer supported"]
        #[method(cancelDownloads:)]
        pub unsafe fn cancelDownloads(&self, downloads: &NSArray<SKDownload>);

        #[method(addTransactionObserver:)]
        pub unsafe fn addTransactionObserver(
            &self,
            observer: &ProtocolObject<dyn SKPaymentTransactionObserver>,
        );

        #[method(removeTransactionObserver:)]
        pub unsafe fn removeTransactionObserver(
            &self,
            observer: &ProtocolObject<dyn SKPaymentTransactionObserver>,
        );

        #[cfg(feature = "Foundation_NSArray")]
        #[method_id(@__retain_semantics Other transactionObservers)]
        pub unsafe fn transactionObservers(
            &self,
        ) -> Id<NSArray<ProtocolObject<dyn SKPaymentTransactionObserver>>>;

        #[cfg(all(
            feature = "Foundation_NSArray",
            feature = "StoreKit_SKPaymentTransaction"
        ))]
        #[method_id(@__retain_semantics Other transactions)]
        pub unsafe fn transactions(&self) -> Id<NSArray<SKPaymentTransaction>>;

        #[method(showPriceConsentIfNeeded)]
        pub unsafe fn showPriceConsentIfNeeded(&self);

        #[method(presentCodeRedemptionSheet)]
        pub unsafe fn presentCodeRedemptionSheet(&self);
    }
);

extern_methods!(
    /// Methods declared on superclass `NSObject`
    #[cfg(feature = "StoreKit_SKPaymentQueue")]
    unsafe impl SKPaymentQueue {
        #[method_id(@__retain_semantics Init init)]
        pub unsafe fn init(this: Option<Allocated<Self>>) -> Id<Self>;

        #[method_id(@__retain_semantics New new)]
        pub unsafe fn new() -> Id<Self>;
    }
);

extern_protocol!(
    pub unsafe trait SKPaymentQueueDelegate: NSObjectProtocol {
        #[cfg(all(
            feature = "StoreKit_SKPaymentQueue",
            feature = "StoreKit_SKPaymentTransaction",
            feature = "StoreKit_SKStorefront"
        ))]
        #[optional]
        #[method(paymentQueue:shouldContinueTransaction:inStorefront:)]
        unsafe fn paymentQueue_shouldContinueTransaction_inStorefront(
            &self,
            payment_queue: &SKPaymentQueue,
            transaction: &SKPaymentTransaction,
            new_storefront: &SKStorefront,
        ) -> bool;

        #[cfg(feature = "StoreKit_SKPaymentQueue")]
        #[optional]
        #[method(paymentQueueShouldShowPriceConsent:)]
        unsafe fn paymentQueueShouldShowPriceConsent(&self, payment_queue: &SKPaymentQueue)
            -> bool;
    }

    unsafe impl ProtocolType for dyn SKPaymentQueueDelegate {}
);

extern_protocol!(
    pub unsafe trait SKPaymentTransactionObserver: NSObjectProtocol {
        #[cfg(all(
            feature = "Foundation_NSArray",
            feature = "StoreKit_SKPaymentQueue",
            feature = "StoreKit_SKPaymentTransaction"
        ))]
        #[method(paymentQueue:updatedTransactions:)]
        unsafe fn paymentQueue_updatedTransactions(
            &self,
            queue: &SKPaymentQueue,
            transactions: &NSArray<SKPaymentTransaction>,
        );

        #[cfg(all(
            feature = "Foundation_NSArray",
            feature = "StoreKit_SKPaymentQueue",
            feature = "StoreKit_SKPaymentTransaction"
        ))]
        #[optional]
        #[method(paymentQueue:removedTransactions:)]
        unsafe fn paymentQueue_removedTransactions(
            &self,
            queue: &SKPaymentQueue,
            transactions: &NSArray<SKPaymentTransaction>,
        );

        #[cfg(all(feature = "Foundation_NSError", feature = "StoreKit_SKPaymentQueue"))]
        #[optional]
        #[method(paymentQueue:restoreCompletedTransactionsFailedWithError:)]
        unsafe fn paymentQueue_restoreCompletedTransactionsFailedWithError(
            &self,
            queue: &SKPaymentQueue,
            error: &NSError,
        );

        #[cfg(feature = "StoreKit_SKPaymentQueue")]
        #[optional]
        #[method(paymentQueueRestoreCompletedTransactionsFinished:)]
        unsafe fn paymentQueueRestoreCompletedTransactionsFinished(&self, queue: &SKPaymentQueue);

        #[cfg(all(
            feature = "Foundation_NSArray",
            feature = "StoreKit_SKDownload",
            feature = "StoreKit_SKPaymentQueue"
        ))]
        #[deprecated = "Hosted content is no longer supported"]
        #[optional]
        #[method(paymentQueue:updatedDownloads:)]
        unsafe fn paymentQueue_updatedDownloads(
            &self,
            queue: &SKPaymentQueue,
            downloads: &NSArray<SKDownload>,
        );

        #[cfg(all(
            feature = "StoreKit_SKPayment",
            feature = "StoreKit_SKPaymentQueue",
            feature = "StoreKit_SKProduct"
        ))]
        #[optional]
        #[method(paymentQueue:shouldAddStorePayment:forProduct:)]
        unsafe fn paymentQueue_shouldAddStorePayment_forProduct(
            &self,
            queue: &SKPaymentQueue,
            payment: &SKPayment,
            product: &SKProduct,
        ) -> bool;

        #[cfg(feature = "StoreKit_SKPaymentQueue")]
        #[optional]
        #[method(paymentQueueDidChangeStorefront:)]
        unsafe fn paymentQueueDidChangeStorefront(&self, queue: &SKPaymentQueue);

        #[cfg(all(
            feature = "Foundation_NSArray",
            feature = "Foundation_NSString",
            feature = "StoreKit_SKPaymentQueue"
        ))]
        #[optional]
        #[method(paymentQueue:didRevokeEntitlementsForProductIdentifiers:)]
        unsafe fn paymentQueue_didRevokeEntitlementsForProductIdentifiers(
            &self,
            queue: &SKPaymentQueue,
            product_identifiers: &NSArray<NSString>,
        );
    }

    unsafe impl ProtocolType for dyn SKPaymentTransactionObserver {}
);
