//! 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 objc2_foundation::*;

use crate::*;

extern_class!(
    /// Only AND compound predicates are allowed.
    ///
    /// Key names must begin with either an upper or lower case character ([a-zA-Z]) and may be followed by characters, numbers, or underscores ([0-9a-zA-Z_]). Keypaths may only resolve to the currently evaluated object, so the '.' character is not allowed in key names.
    ///
    /// A limited subset of classes are allowed as predicate arguments:
    /// - NSString
    /// - NSDate
    /// - NSData
    /// - NSNumber
    /// - NSArray
    /// - CKReference
    /// - CKRecord
    /// - CLLocation
    ///
    /// Any other class as an argument will result in an error when executing the query.
    ///
    /// See also [Apple's documentation](https://developer.apple.com/documentation/cloudkit/ckquery?language=objc)
    #[unsafe(super(NSObject))]
    #[derive(Debug, PartialEq, Eq, Hash)]
    pub struct CKQuery;
);

extern_conformance!(
    unsafe impl NSCoding for CKQuery {}
);

extern_conformance!(
    unsafe impl NSCopying for CKQuery {}
);

unsafe impl CopyingHelper for CKQuery {
    type Result = Self;
}

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

extern_conformance!(
    unsafe impl NSSecureCoding for CKQuery {}
);

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

        #[unsafe(method(new))]
        #[unsafe(method_family = new)]
        pub unsafe fn new() -> Retained<Self>;

        /// # Safety
        ///
        /// `a_decoder` possibly has further requirements.
        #[unsafe(method(initWithCoder:))]
        #[unsafe(method_family = init)]
        pub unsafe fn initWithCoder(this: Allocated<Self>, a_decoder: &NSCoder) -> Retained<Self>;

        #[cfg(feature = "CKRecord")]
        /// Use
        ///
        /// ```text
        ///  [NSPredicate predicateWithValue:YES] / NSPredicate(value: true)
        /// ```
        ///
        /// if you want to query for all records of a given type.
        #[unsafe(method(initWithRecordType:predicate:))]
        #[unsafe(method_family = init)]
        pub unsafe fn initWithRecordType_predicate(
            this: Allocated<Self>,
            record_type: &CKRecordType,
            predicate: &NSPredicate,
        ) -> Retained<Self>;

        #[cfg(feature = "CKRecord")]
        #[unsafe(method(recordType))]
        #[unsafe(method_family = none)]
        pub unsafe fn recordType(&self) -> Retained<CKRecordType>;

        #[unsafe(method(predicate))]
        #[unsafe(method_family = none)]
        pub unsafe fn predicate(&self) -> Retained<NSPredicate>;

        #[unsafe(method(sortDescriptors))]
        #[unsafe(method_family = none)]
        pub unsafe fn sortDescriptors(&self) -> Option<Retained<NSArray<NSSortDescriptor>>>;

        /// Setter for [`sortDescriptors`][Self::sortDescriptors].
        ///
        /// This is [copied][objc2_foundation::NSCopying::copy] when set.
        #[unsafe(method(setSortDescriptors:))]
        #[unsafe(method_family = none)]
        pub unsafe fn setSortDescriptors(
            &self,
            sort_descriptors: Option<&NSArray<NSSortDescriptor>>,
        );
    );
}
