//! This file has been automatically generated by `objc2`'s `header-translator`.
//! DO NOT EDIT
use core::ffi::*;
use core::ptr::NonNull;
use objc2::__framework_prelude::*;

use crate::*;

/// [Apple's documentation](https://developer.apple.com/documentation/foundation/nsitemproviderrepresentationvisibility?language=objc)
// NS_ENUM
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct NSItemProviderRepresentationVisibility(pub NSInteger);
impl NSItemProviderRepresentationVisibility {
    #[doc(alias = "NSItemProviderRepresentationVisibilityAll")]
    pub const All: Self = Self(0);
    #[doc(alias = "NSItemProviderRepresentationVisibilityTeam")]
    pub const Team: Self = Self(1);
    #[doc(alias = "NSItemProviderRepresentationVisibilityGroup")]
    pub const Group: Self = Self(2);
    #[doc(alias = "NSItemProviderRepresentationVisibilityOwnProcess")]
    pub const OwnProcess: Self = Self(3);
}

unsafe impl Encode for NSItemProviderRepresentationVisibility {
    const ENCODING: Encoding = NSInteger::ENCODING;
}

unsafe impl RefEncode for NSItemProviderRepresentationVisibility {
    const ENCODING_REF: Encoding = Encoding::Pointer(&Self::ENCODING);
}

/// [Apple's documentation](https://developer.apple.com/documentation/foundation/nsitemproviderfileoptions?language=objc)
// NS_OPTIONS
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct NSItemProviderFileOptions(pub NSInteger);
bitflags::bitflags! {
    impl NSItemProviderFileOptions: NSInteger {
        #[doc(alias = "NSItemProviderFileOptionOpenInPlace")]
        const OpenInPlace = 1;
    }
}

unsafe impl Encode for NSItemProviderFileOptions {
    const ENCODING: Encoding = NSInteger::ENCODING;
}

unsafe impl RefEncode for NSItemProviderFileOptions {
    const ENCODING_REF: Encoding = Encoding::Pointer(&Self::ENCODING);
}

extern_protocol!(
    /// [Apple's documentation](https://developer.apple.com/documentation/foundation/nsitemproviderwriting?language=objc)
    pub unsafe trait NSItemProviderWriting: NSObjectProtocol {
        #[cfg(all(feature = "NSArray", feature = "NSString"))]
        #[unsafe(method(writableTypeIdentifiersForItemProvider))]
        #[unsafe(method_family = none)]
        fn writableTypeIdentifiersForItemProvider_class() -> Retained<NSArray<NSString>>;

        #[cfg(all(feature = "NSArray", feature = "NSString"))]
        #[optional]
        #[unsafe(method(writableTypeIdentifiersForItemProvider))]
        #[unsafe(method_family = none)]
        fn writableTypeIdentifiersForItemProvider(&self) -> Retained<NSArray<NSString>>;

        #[cfg(feature = "NSString")]
        #[optional]
        #[unsafe(method(itemProviderVisibilityForRepresentationWithTypeIdentifier:))]
        #[unsafe(method_family = none)]
        fn itemProviderVisibilityForRepresentationWithTypeIdentifier_class(
            type_identifier: &NSString,
        ) -> NSItemProviderRepresentationVisibility;

        #[cfg(feature = "NSString")]
        #[optional]
        #[unsafe(method(itemProviderVisibilityForRepresentationWithTypeIdentifier:))]
        #[unsafe(method_family = none)]
        fn itemProviderVisibilityForRepresentationWithTypeIdentifier(
            &self,
            type_identifier: &NSString,
        ) -> NSItemProviderRepresentationVisibility;

        #[cfg(all(
            feature = "NSData",
            feature = "NSError",
            feature = "NSProgress",
            feature = "NSString",
            feature = "block2"
        ))]
        /// # Safety
        ///
        /// `completion_handler` block must be sendable.
        #[unsafe(method(loadDataWithTypeIdentifier:forItemProviderCompletionHandler:))]
        #[unsafe(method_family = none)]
        unsafe fn loadDataWithTypeIdentifier_forItemProviderCompletionHandler(
            &self,
            type_identifier: &NSString,
            completion_handler: &block2::DynBlock<dyn Fn(*mut NSData, *mut NSError)>,
        ) -> Option<Retained<NSProgress>>;
    }
);

extern_protocol!(
    /// [Apple's documentation](https://developer.apple.com/documentation/foundation/nsitemproviderreading?language=objc)
    pub unsafe trait NSItemProviderReading: NSObjectProtocol {
        #[cfg(all(feature = "NSArray", feature = "NSString"))]
        #[unsafe(method(readableTypeIdentifiersForItemProvider))]
        #[unsafe(method_family = none)]
        fn readableTypeIdentifiersForItemProvider() -> Retained<NSArray<NSString>>;

        #[cfg(all(feature = "NSData", feature = "NSError", feature = "NSString"))]
        #[unsafe(method(objectWithItemProviderData:typeIdentifier:error:_))]
        #[unsafe(method_family = none)]
        fn objectWithItemProviderData_typeIdentifier_error(
            data: &NSData,
            type_identifier: &NSString,
        ) -> Result<Retained<Self>, Retained<NSError>>;
    }
);

/// [Apple's documentation](https://developer.apple.com/documentation/foundation/nsitemprovidercompletionhandler?language=objc)
#[cfg(all(feature = "NSError", feature = "NSObject", feature = "block2"))]
pub type NSItemProviderCompletionHandler =
    *mut block2::DynBlock<dyn Fn(*mut ProtocolObject<dyn NSSecureCoding>, *mut NSError)>;

/// [Apple's documentation](https://developer.apple.com/documentation/foundation/nsitemproviderloadhandler?language=objc)
#[cfg(all(
    feature = "NSDictionary",
    feature = "NSError",
    feature = "NSObject",
    feature = "block2"
))]
pub type NSItemProviderLoadHandler = *mut block2::DynBlock<
    dyn Fn(NSItemProviderCompletionHandler, *const AnyClass, *mut NSDictionary),
>;

extern_class!(
    /// [Apple's documentation](https://developer.apple.com/documentation/foundation/nsitemprovider?language=objc)
    #[unsafe(super(NSObject))]
    #[derive(Debug, PartialEq, Eq, Hash)]
    pub struct NSItemProvider;
);

#[cfg(feature = "NSObject")]
extern_conformance!(
    unsafe impl NSCopying for NSItemProvider {}
);

#[cfg(feature = "NSObject")]
unsafe impl CopyingHelper for NSItemProvider {
    type Result = Self;
}

extern_conformance!(
    unsafe impl NSObjectProtocol for NSItemProvider {}
);

impl NSItemProvider {
    extern_methods!(
        #[unsafe(method(init))]
        #[unsafe(method_family = init)]
        pub fn init(this: Allocated<Self>) -> Retained<Self>;

        #[cfg(all(
            feature = "NSData",
            feature = "NSError",
            feature = "NSProgress",
            feature = "NSString",
            feature = "block2"
        ))]
        /// # Safety
        ///
        /// `load_handler` block must be sendable.
        #[unsafe(method(registerDataRepresentationForTypeIdentifier:visibility:loadHandler:))]
        #[unsafe(method_family = none)]
        pub unsafe fn registerDataRepresentationForTypeIdentifier_visibility_loadHandler(
            &self,
            type_identifier: &NSString,
            visibility: NSItemProviderRepresentationVisibility,
            load_handler: &block2::DynBlock<
                dyn Fn(
                    NonNull<block2::DynBlock<dyn Fn(*mut NSData, *mut NSError)>>,
                ) -> *mut NSProgress,
            >,
        );

        #[cfg(all(
            feature = "NSError",
            feature = "NSProgress",
            feature = "NSString",
            feature = "NSURL",
            feature = "block2"
        ))]
        /// # Safety
        ///
        /// `load_handler` block must be sendable.
        #[unsafe(method(registerFileRepresentationForTypeIdentifier:fileOptions:visibility:loadHandler:))]
        #[unsafe(method_family = none)]
        pub unsafe fn registerFileRepresentationForTypeIdentifier_fileOptions_visibility_loadHandler(
            &self,
            type_identifier: &NSString,
            file_options: NSItemProviderFileOptions,
            visibility: NSItemProviderRepresentationVisibility,
            load_handler: &block2::DynBlock<
                dyn Fn(
                    NonNull<block2::DynBlock<dyn Fn(*mut NSURL, Bool, *mut NSError)>>,
                ) -> *mut NSProgress,
            >,
        );

        #[cfg(all(feature = "NSArray", feature = "NSString"))]
        #[unsafe(method(registeredTypeIdentifiers))]
        #[unsafe(method_family = none)]
        pub fn registeredTypeIdentifiers(&self) -> Retained<NSArray<NSString>>;

        #[cfg(all(feature = "NSArray", feature = "NSString"))]
        #[unsafe(method(registeredTypeIdentifiersWithFileOptions:))]
        #[unsafe(method_family = none)]
        pub fn registeredTypeIdentifiersWithFileOptions(
            &self,
            file_options: NSItemProviderFileOptions,
        ) -> Retained<NSArray<NSString>>;

        #[cfg(feature = "NSString")]
        #[unsafe(method(hasItemConformingToTypeIdentifier:))]
        #[unsafe(method_family = none)]
        pub fn hasItemConformingToTypeIdentifier(&self, type_identifier: &NSString) -> bool;

        #[cfg(feature = "NSString")]
        #[unsafe(method(hasRepresentationConformingToTypeIdentifier:fileOptions:))]
        #[unsafe(method_family = none)]
        pub fn hasRepresentationConformingToTypeIdentifier_fileOptions(
            &self,
            type_identifier: &NSString,
            file_options: NSItemProviderFileOptions,
        ) -> bool;

        #[cfg(all(
            feature = "NSData",
            feature = "NSError",
            feature = "NSProgress",
            feature = "NSString",
            feature = "block2"
        ))]
        /// # Safety
        ///
        /// `completion_handler` block must be sendable.
        #[unsafe(method(loadDataRepresentationForTypeIdentifier:completionHandler:))]
        #[unsafe(method_family = none)]
        pub unsafe fn loadDataRepresentationForTypeIdentifier_completionHandler(
            &self,
            type_identifier: &NSString,
            completion_handler: &block2::DynBlock<dyn Fn(*mut NSData, *mut NSError)>,
        ) -> Retained<NSProgress>;

        #[cfg(all(
            feature = "NSError",
            feature = "NSProgress",
            feature = "NSString",
            feature = "NSURL",
            feature = "block2"
        ))]
        /// # Safety
        ///
        /// `completion_handler` block must be sendable.
        #[unsafe(method(loadFileRepresentationForTypeIdentifier:completionHandler:))]
        #[unsafe(method_family = none)]
        pub unsafe fn loadFileRepresentationForTypeIdentifier_completionHandler(
            &self,
            type_identifier: &NSString,
            completion_handler: &block2::DynBlock<dyn Fn(*mut NSURL, *mut NSError)>,
        ) -> Retained<NSProgress>;

        #[cfg(all(
            feature = "NSError",
            feature = "NSProgress",
            feature = "NSString",
            feature = "NSURL",
            feature = "block2"
        ))]
        /// # Safety
        ///
        /// `completion_handler` block must be sendable.
        #[unsafe(method(loadInPlaceFileRepresentationForTypeIdentifier:completionHandler:))]
        #[unsafe(method_family = none)]
        pub unsafe fn loadInPlaceFileRepresentationForTypeIdentifier_completionHandler(
            &self,
            type_identifier: &NSString,
            completion_handler: &block2::DynBlock<dyn Fn(*mut NSURL, Bool, *mut NSError)>,
        ) -> Retained<NSProgress>;

        #[cfg(feature = "NSString")]
        #[unsafe(method(suggestedName))]
        #[unsafe(method_family = none)]
        pub fn suggestedName(&self) -> Option<Retained<NSString>>;

        #[cfg(feature = "NSString")]
        /// Setter for [`suggestedName`][Self::suggestedName].
        ///
        /// This is [copied][crate::NSCopying::copy] when set.
        #[unsafe(method(setSuggestedName:))]
        #[unsafe(method_family = none)]
        pub fn setSuggestedName(&self, suggested_name: Option<&NSString>);

        #[unsafe(method(initWithObject:))]
        #[unsafe(method_family = init)]
        pub fn initWithObject(
            this: Allocated<Self>,
            object: &ProtocolObject<dyn NSItemProviderWriting>,
        ) -> Retained<Self>;

        #[unsafe(method(registerObject:visibility:))]
        #[unsafe(method_family = none)]
        pub fn registerObject_visibility(
            &self,
            object: &ProtocolObject<dyn NSItemProviderWriting>,
            visibility: NSItemProviderRepresentationVisibility,
        );

        #[cfg(all(feature = "NSObject", feature = "NSString"))]
        /// # Safety
        ///
        /// `item` should be of the correct type.
        #[unsafe(method(initWithItem:typeIdentifier:))]
        #[unsafe(method_family = init)]
        pub unsafe fn initWithItem_typeIdentifier(
            this: Allocated<Self>,
            item: Option<&ProtocolObject<dyn NSSecureCoding>>,
            type_identifier: Option<&NSString>,
        ) -> Retained<Self>;

        #[cfg(feature = "NSURL")]
        /// # Safety
        ///
        /// `file_url` might not allow `None`.
        #[unsafe(method(initWithContentsOfURL:))]
        #[unsafe(method_family = init)]
        pub unsafe fn initWithContentsOfURL(
            this: Allocated<Self>,
            file_url: Option<&NSURL>,
        ) -> Option<Retained<Self>>;

        #[cfg(all(
            feature = "NSDictionary",
            feature = "NSError",
            feature = "NSObject",
            feature = "NSString",
            feature = "block2"
        ))]
        /// # Safety
        ///
        /// `load_handler` must be a valid pointer.
        #[unsafe(method(registerItemForTypeIdentifier:loadHandler:))]
        #[unsafe(method_family = none)]
        pub unsafe fn registerItemForTypeIdentifier_loadHandler(
            &self,
            type_identifier: &NSString,
            load_handler: NSItemProviderLoadHandler,
        );

        #[cfg(all(
            feature = "NSDictionary",
            feature = "NSError",
            feature = "NSObject",
            feature = "NSString",
            feature = "block2"
        ))]
        /// # Safety
        ///
        /// - `options` generic should be of the correct type.
        /// - `completion_handler` must be a valid pointer or null.
        #[unsafe(method(loadItemForTypeIdentifier:options:completionHandler:))]
        #[unsafe(method_family = none)]
        pub unsafe fn loadItemForTypeIdentifier_options_completionHandler(
            &self,
            type_identifier: &NSString,
            options: Option<&NSDictionary>,
            completion_handler: NSItemProviderCompletionHandler,
        );
    );
}

/// Methods declared on superclass `NSObject`.
impl NSItemProvider {
    extern_methods!(
        #[unsafe(method(new))]
        #[unsafe(method_family = new)]
        pub fn new() -> Retained<Self>;
    );
}

impl DefaultRetained for NSItemProvider {
    #[inline]
    fn default_retained() -> Retained<Self> {
        Self::new()
    }
}

extern "C" {
    /// [Apple's documentation](https://developer.apple.com/documentation/foundation/nsitemproviderpreferredimagesizekey?language=objc)
    #[cfg(feature = "NSString")]
    pub static NSItemProviderPreferredImageSizeKey: &'static NSString;
}

/// NSPreviewSupport.
impl NSItemProvider {
    extern_methods!(
        #[cfg(all(
            feature = "NSDictionary",
            feature = "NSError",
            feature = "NSObject",
            feature = "block2"
        ))]
        /// # Safety
        ///
        /// The returned block must be sendable.
        #[unsafe(method(previewImageHandler))]
        #[unsafe(method_family = none)]
        pub unsafe fn previewImageHandler(&self) -> NSItemProviderLoadHandler;

        #[cfg(all(
            feature = "NSDictionary",
            feature = "NSError",
            feature = "NSObject",
            feature = "block2"
        ))]
        /// Setter for [`previewImageHandler`][Self::previewImageHandler].
        ///
        /// This is [copied][crate::NSCopying::copy] when set.
        ///
        /// # Safety
        ///
        /// `preview_image_handler` must be a valid pointer or null.
        #[unsafe(method(setPreviewImageHandler:))]
        #[unsafe(method_family = none)]
        pub unsafe fn setPreviewImageHandler(
            &self,
            preview_image_handler: NSItemProviderLoadHandler,
        );

        #[cfg(all(
            feature = "NSDictionary",
            feature = "NSError",
            feature = "NSObject",
            feature = "block2"
        ))]
        /// # Safety
        ///
        /// - `options` generic should be of the correct type.
        /// - `options` might not allow `None`.
        /// - `completion_handler` must be a valid pointer.
        #[unsafe(method(loadPreviewImageWithOptions:completionHandler:))]
        #[unsafe(method_family = none)]
        pub unsafe fn loadPreviewImageWithOptions_completionHandler(
            &self,
            options: Option<&NSDictionary>,
            completion_handler: NSItemProviderCompletionHandler,
        );
    );
}

extern "C" {
    /// [Apple's documentation](https://developer.apple.com/documentation/foundation/nsextensionjavascriptpreprocessingresultskey?language=objc)
    #[cfg(feature = "NSString")]
    pub static NSExtensionJavaScriptPreprocessingResultsKey: Option<&'static NSString>;
}

extern "C" {
    /// [Apple's documentation](https://developer.apple.com/documentation/foundation/nsextensionjavascriptfinalizeargumentkey?language=objc)
    #[cfg(feature = "NSString")]
    pub static NSExtensionJavaScriptFinalizeArgumentKey: Option<&'static NSString>;
}

extern "C" {
    /// [Apple's documentation](https://developer.apple.com/documentation/foundation/nsitemprovidererrordomain?language=objc)
    #[cfg(feature = "NSString")]
    pub static NSItemProviderErrorDomain: &'static NSString;
}

/// [Apple's documentation](https://developer.apple.com/documentation/foundation/nsitemprovidererrorcode?language=objc)
// NS_ENUM
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct NSItemProviderErrorCode(pub NSInteger);
impl NSItemProviderErrorCode {
    #[doc(alias = "NSItemProviderUnknownError")]
    pub const UnknownError: Self = Self(-1);
    #[doc(alias = "NSItemProviderItemUnavailableError")]
    pub const ItemUnavailableError: Self = Self(-1000);
    #[doc(alias = "NSItemProviderUnexpectedValueClassError")]
    pub const UnexpectedValueClassError: Self = Self(-1100);
    #[doc(alias = "NSItemProviderUnavailableCoercionError")]
    pub const UnavailableCoercionError: Self = Self(-1200);
}

unsafe impl Encode for NSItemProviderErrorCode {
    const ENCODING: Encoding = NSInteger::ENCODING;
}

unsafe impl RefEncode for NSItemProviderErrorCode {
    const ENCODING_REF: Encoding = Encoding::Pointer(&Self::ENCODING);
}
