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

use crate::*;

// NS_OPTIONS
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct NSKeyValueObservingOptions(pub NSUInteger);
bitflags::bitflags! {
    impl NSKeyValueObservingOptions: NSUInteger {
        const NSKeyValueObservingOptionNew = 0x01;
        const NSKeyValueObservingOptionOld = 0x02;
        const NSKeyValueObservingOptionInitial = 0x04;
        const NSKeyValueObservingOptionPrior = 0x08;
    }
}

unsafe impl Encode for NSKeyValueObservingOptions {
    const ENCODING: Encoding = NSUInteger::ENCODING;
}

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

// NS_ENUM
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct NSKeyValueChange(pub NSUInteger);
impl NSKeyValueChange {
    #[doc(alias = "NSKeyValueChangeSetting")]
    pub const Setting: Self = Self(1);
    #[doc(alias = "NSKeyValueChangeInsertion")]
    pub const Insertion: Self = Self(2);
    #[doc(alias = "NSKeyValueChangeRemoval")]
    pub const Removal: Self = Self(3);
    #[doc(alias = "NSKeyValueChangeReplacement")]
    pub const Replacement: Self = Self(4);
}

unsafe impl Encode for NSKeyValueChange {
    const ENCODING: Encoding = NSUInteger::ENCODING;
}

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

// NS_ENUM
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct NSKeyValueSetMutationKind(pub NSUInteger);
impl NSKeyValueSetMutationKind {
    pub const NSKeyValueUnionSetMutation: Self = Self(1);
    pub const NSKeyValueMinusSetMutation: Self = Self(2);
    pub const NSKeyValueIntersectSetMutation: Self = Self(3);
    pub const NSKeyValueSetSetMutation: Self = Self(4);
}

unsafe impl Encode for NSKeyValueSetMutationKind {
    const ENCODING: Encoding = NSUInteger::ENCODING;
}

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

// NS_TYPED_ENUM
#[cfg(feature = "NSString")]
pub type NSKeyValueChangeKey = NSString;

extern "C" {
    #[cfg(feature = "NSString")]
    pub static NSKeyValueChangeKindKey: &'static NSKeyValueChangeKey;
}

extern "C" {
    #[cfg(feature = "NSString")]
    pub static NSKeyValueChangeNewKey: &'static NSKeyValueChangeKey;
}

extern "C" {
    #[cfg(feature = "NSString")]
    pub static NSKeyValueChangeOldKey: &'static NSKeyValueChangeKey;
}

extern "C" {
    #[cfg(feature = "NSString")]
    pub static NSKeyValueChangeIndexesKey: &'static NSKeyValueChangeKey;
}

extern "C" {
    #[cfg(feature = "NSString")]
    pub static NSKeyValueChangeNotificationIsPriorKey: &'static NSKeyValueChangeKey;
}

extern_category!(
    /// Category "NSKeyValueObserving" on [`NSObject`].
    #[doc(alias = "NSKeyValueObserving")]
    pub unsafe trait NSObjectNSKeyValueObserving {
        #[cfg(all(feature = "NSDictionary", feature = "NSString"))]
        #[method(observeValueForKeyPath:ofObject:change:context:)]
        unsafe fn observeValueForKeyPath_ofObject_change_context(
            &self,
            key_path: Option<&NSString>,
            object: Option<&AnyObject>,
            change: Option<&NSDictionary<NSKeyValueChangeKey, AnyObject>>,
            context: *mut c_void,
        );
    }

    unsafe impl NSObjectNSKeyValueObserving for NSObject {}
);

extern_category!(
    /// Category "NSKeyValueObserverRegistration" on [`NSObject`].
    #[doc(alias = "NSKeyValueObserverRegistration")]
    pub unsafe trait NSObjectNSKeyValueObserverRegistration {
        #[cfg(feature = "NSString")]
        #[method(addObserver:forKeyPath:options:context:)]
        unsafe fn addObserver_forKeyPath_options_context(
            &self,
            observer: &NSObject,
            key_path: &NSString,
            options: NSKeyValueObservingOptions,
            context: *mut c_void,
        );

        #[cfg(feature = "NSString")]
        #[method(removeObserver:forKeyPath:context:)]
        unsafe fn removeObserver_forKeyPath_context(
            &self,
            observer: &NSObject,
            key_path: &NSString,
            context: *mut c_void,
        );

        #[cfg(feature = "NSString")]
        #[method(removeObserver:forKeyPath:)]
        unsafe fn removeObserver_forKeyPath(&self, observer: &NSObject, key_path: &NSString);
    }

    unsafe impl NSObjectNSKeyValueObserverRegistration for NSObject {}
);

extern_methods!(
    /// NSKeyValueObserverRegistration
    #[cfg(feature = "NSArray")]
    unsafe impl<ObjectType: Message> NSArray<ObjectType> {
        #[cfg(all(feature = "NSIndexSet", feature = "NSString"))]
        #[method(addObserver:toObjectsAtIndexes:forKeyPath:options:context:)]
        pub unsafe fn addObserver_toObjectsAtIndexes_forKeyPath_options_context(
            &self,
            observer: &NSObject,
            indexes: &NSIndexSet,
            key_path: &NSString,
            options: NSKeyValueObservingOptions,
            context: *mut c_void,
        );

        #[cfg(all(feature = "NSIndexSet", feature = "NSString"))]
        #[method(removeObserver:fromObjectsAtIndexes:forKeyPath:context:)]
        pub unsafe fn removeObserver_fromObjectsAtIndexes_forKeyPath_context(
            &self,
            observer: &NSObject,
            indexes: &NSIndexSet,
            key_path: &NSString,
            context: *mut c_void,
        );

        #[cfg(all(feature = "NSIndexSet", feature = "NSString"))]
        #[method(removeObserver:fromObjectsAtIndexes:forKeyPath:)]
        pub unsafe fn removeObserver_fromObjectsAtIndexes_forKeyPath(
            &self,
            observer: &NSObject,
            indexes: &NSIndexSet,
            key_path: &NSString,
        );

        #[cfg(feature = "NSString")]
        #[method(addObserver:forKeyPath:options:context:)]
        pub unsafe fn addObserver_forKeyPath_options_context(
            &self,
            observer: &NSObject,
            key_path: &NSString,
            options: NSKeyValueObservingOptions,
            context: *mut c_void,
        );

        #[cfg(feature = "NSString")]
        #[method(removeObserver:forKeyPath:context:)]
        pub unsafe fn removeObserver_forKeyPath_context(
            &self,
            observer: &NSObject,
            key_path: &NSString,
            context: *mut c_void,
        );

        #[cfg(feature = "NSString")]
        #[method(removeObserver:forKeyPath:)]
        pub unsafe fn removeObserver_forKeyPath(&self, observer: &NSObject, key_path: &NSString);
    }
);

extern_methods!(
    /// NSKeyValueObserverRegistration
    #[cfg(feature = "NSOrderedSet")]
    unsafe impl<ObjectType: Message> NSOrderedSet<ObjectType> {
        #[cfg(feature = "NSString")]
        #[method(addObserver:forKeyPath:options:context:)]
        pub unsafe fn addObserver_forKeyPath_options_context(
            &self,
            observer: &NSObject,
            key_path: &NSString,
            options: NSKeyValueObservingOptions,
            context: *mut c_void,
        );

        #[cfg(feature = "NSString")]
        #[method(removeObserver:forKeyPath:context:)]
        pub unsafe fn removeObserver_forKeyPath_context(
            &self,
            observer: &NSObject,
            key_path: &NSString,
            context: *mut c_void,
        );

        #[cfg(feature = "NSString")]
        #[method(removeObserver:forKeyPath:)]
        pub unsafe fn removeObserver_forKeyPath(&self, observer: &NSObject, key_path: &NSString);
    }
);

extern_methods!(
    /// NSKeyValueObserverRegistration
    #[cfg(feature = "NSSet")]
    unsafe impl<ObjectType: Message> NSSet<ObjectType> {
        #[cfg(feature = "NSString")]
        #[method(addObserver:forKeyPath:options:context:)]
        pub unsafe fn addObserver_forKeyPath_options_context(
            &self,
            observer: &NSObject,
            key_path: &NSString,
            options: NSKeyValueObservingOptions,
            context: *mut c_void,
        );

        #[cfg(feature = "NSString")]
        #[method(removeObserver:forKeyPath:context:)]
        pub unsafe fn removeObserver_forKeyPath_context(
            &self,
            observer: &NSObject,
            key_path: &NSString,
            context: *mut c_void,
        );

        #[cfg(feature = "NSString")]
        #[method(removeObserver:forKeyPath:)]
        pub unsafe fn removeObserver_forKeyPath(&self, observer: &NSObject, key_path: &NSString);
    }
);

extern_category!(
    /// Category "NSKeyValueObserverNotification" on [`NSObject`].
    #[doc(alias = "NSKeyValueObserverNotification")]
    pub unsafe trait NSObjectNSKeyValueObserverNotification {
        #[cfg(feature = "NSString")]
        #[method(willChangeValueForKey:)]
        unsafe fn willChangeValueForKey(&self, key: &NSString);

        #[cfg(feature = "NSString")]
        #[method(didChangeValueForKey:)]
        unsafe fn didChangeValueForKey(&self, key: &NSString);

        #[cfg(all(feature = "NSIndexSet", feature = "NSString"))]
        #[method(willChange:valuesAtIndexes:forKey:)]
        unsafe fn willChange_valuesAtIndexes_forKey(
            &self,
            change_kind: NSKeyValueChange,
            indexes: &NSIndexSet,
            key: &NSString,
        );

        #[cfg(all(feature = "NSIndexSet", feature = "NSString"))]
        #[method(didChange:valuesAtIndexes:forKey:)]
        unsafe fn didChange_valuesAtIndexes_forKey(
            &self,
            change_kind: NSKeyValueChange,
            indexes: &NSIndexSet,
            key: &NSString,
        );

        #[cfg(all(feature = "NSSet", feature = "NSString"))]
        #[method(willChangeValueForKey:withSetMutation:usingObjects:)]
        unsafe fn willChangeValueForKey_withSetMutation_usingObjects(
            &self,
            key: &NSString,
            mutation_kind: NSKeyValueSetMutationKind,
            objects: &NSSet,
        );

        #[cfg(all(feature = "NSSet", feature = "NSString"))]
        #[method(didChangeValueForKey:withSetMutation:usingObjects:)]
        unsafe fn didChangeValueForKey_withSetMutation_usingObjects(
            &self,
            key: &NSString,
            mutation_kind: NSKeyValueSetMutationKind,
            objects: &NSSet,
        );
    }

    unsafe impl NSObjectNSKeyValueObserverNotification for NSObject {}
);

extern_category!(
    /// Category "NSKeyValueObservingCustomization" on [`NSObject`].
    #[doc(alias = "NSKeyValueObservingCustomization")]
    pub unsafe trait NSObjectNSKeyValueObservingCustomization {
        #[cfg(all(feature = "NSSet", feature = "NSString"))]
        #[method_id(@__retain_semantics Other keyPathsForValuesAffectingValueForKey:)]
        unsafe fn keyPathsForValuesAffectingValueForKey(
            key: &NSString,
        ) -> Retained<NSSet<NSString>>;

        #[cfg(feature = "NSString")]
        #[method(automaticallyNotifiesObserversForKey:)]
        unsafe fn automaticallyNotifiesObserversForKey(key: &NSString) -> bool;

        #[method(observationInfo)]
        unsafe fn observationInfo(&self) -> *mut c_void;

        #[method(setObservationInfo:)]
        unsafe fn setObservationInfo(&self, observation_info: *mut c_void);
    }

    unsafe impl NSObjectNSKeyValueObservingCustomization for NSObject {}
);
