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

use crate::*;

extern_class!(
    #[derive(Debug, PartialEq, Eq, Hash)]
    pub struct NSTimeZone;

    unsafe impl ClassType for NSTimeZone {
        type Super = NSObject;
        type Mutability = InteriorMutable;
    }
);

unsafe impl Send for NSTimeZone {}

unsafe impl Sync for NSTimeZone {}

#[cfg(feature = "NSObject")]
unsafe impl NSCoding for NSTimeZone {}

#[cfg(feature = "NSObject")]
unsafe impl NSCopying for NSTimeZone {}

unsafe impl NSObjectProtocol for NSTimeZone {}

#[cfg(feature = "NSObject")]
unsafe impl NSSecureCoding for NSTimeZone {}

extern_methods!(
    unsafe impl NSTimeZone {
        #[cfg(feature = "NSString")]
        #[method_id(@__retain_semantics Other name)]
        pub unsafe fn name(&self) -> Retained<NSString>;

        #[cfg(feature = "NSData")]
        #[method_id(@__retain_semantics Other data)]
        pub unsafe fn data(&self) -> Retained<NSData>;

        #[cfg(feature = "NSDate")]
        #[method(secondsFromGMTForDate:)]
        pub unsafe fn secondsFromGMTForDate(&self, a_date: &NSDate) -> NSInteger;

        #[cfg(all(feature = "NSDate", feature = "NSString"))]
        #[method_id(@__retain_semantics Other abbreviationForDate:)]
        pub unsafe fn abbreviationForDate(&self, a_date: &NSDate) -> Option<Retained<NSString>>;

        #[cfg(feature = "NSDate")]
        #[method(isDaylightSavingTimeForDate:)]
        pub unsafe fn isDaylightSavingTimeForDate(&self, a_date: &NSDate) -> bool;

        #[cfg(feature = "NSDate")]
        #[method(daylightSavingTimeOffsetForDate:)]
        pub unsafe fn daylightSavingTimeOffsetForDate(&self, a_date: &NSDate) -> NSTimeInterval;

        #[cfg(feature = "NSDate")]
        #[method_id(@__retain_semantics Other nextDaylightSavingTimeTransitionAfterDate:)]
        pub unsafe fn nextDaylightSavingTimeTransitionAfterDate(
            &self,
            a_date: &NSDate,
        ) -> Option<Retained<NSDate>>;
    }
);

extern_methods!(
    /// Methods declared on superclass `NSObject`
    unsafe impl NSTimeZone {
        #[method_id(@__retain_semantics Init init)]
        pub unsafe fn init(this: Allocated<Self>) -> Retained<Self>;

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

// NS_ENUM
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct NSTimeZoneNameStyle(pub NSInteger);
impl NSTimeZoneNameStyle {
    #[doc(alias = "NSTimeZoneNameStyleStandard")]
    pub const Standard: Self = Self(0);
    #[doc(alias = "NSTimeZoneNameStyleShortStandard")]
    pub const ShortStandard: Self = Self(1);
    #[doc(alias = "NSTimeZoneNameStyleDaylightSaving")]
    pub const DaylightSaving: Self = Self(2);
    #[doc(alias = "NSTimeZoneNameStyleShortDaylightSaving")]
    pub const ShortDaylightSaving: Self = Self(3);
    #[doc(alias = "NSTimeZoneNameStyleGeneric")]
    pub const Generic: Self = Self(4);
    #[doc(alias = "NSTimeZoneNameStyleShortGeneric")]
    pub const ShortGeneric: Self = Self(5);
}

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

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

extern_methods!(
    /// NSExtendedTimeZone
    unsafe impl NSTimeZone {
        #[method_id(@__retain_semantics Other systemTimeZone)]
        pub unsafe fn systemTimeZone() -> Retained<NSTimeZone>;

        #[method(resetSystemTimeZone)]
        pub unsafe fn resetSystemTimeZone();

        #[method_id(@__retain_semantics Other defaultTimeZone)]
        pub unsafe fn defaultTimeZone() -> Retained<NSTimeZone>;

        #[method(setDefaultTimeZone:)]
        pub unsafe fn setDefaultTimeZone(default_time_zone: &NSTimeZone);

        #[method_id(@__retain_semantics Other localTimeZone)]
        pub unsafe fn localTimeZone() -> Retained<NSTimeZone>;

        #[cfg(all(feature = "NSArray", feature = "NSString"))]
        #[method_id(@__retain_semantics Other knownTimeZoneNames)]
        pub unsafe fn knownTimeZoneNames() -> Retained<NSArray<NSString>>;

        #[cfg(all(feature = "NSDictionary", feature = "NSString"))]
        #[method_id(@__retain_semantics Other abbreviationDictionary)]
        pub unsafe fn abbreviationDictionary() -> Retained<NSDictionary<NSString, NSString>>;

        #[cfg(all(feature = "NSDictionary", feature = "NSString"))]
        #[method(setAbbreviationDictionary:)]
        pub unsafe fn setAbbreviationDictionary(
            abbreviation_dictionary: &NSDictionary<NSString, NSString>,
        );

        #[cfg(feature = "NSString")]
        #[method_id(@__retain_semantics Other timeZoneDataVersion)]
        pub unsafe fn timeZoneDataVersion() -> Retained<NSString>;

        #[method(secondsFromGMT)]
        pub unsafe fn secondsFromGMT(&self) -> NSInteger;

        #[cfg(feature = "NSString")]
        #[method_id(@__retain_semantics Other abbreviation)]
        pub unsafe fn abbreviation(&self) -> Option<Retained<NSString>>;

        #[method(isDaylightSavingTime)]
        pub unsafe fn isDaylightSavingTime(&self) -> bool;

        #[cfg(feature = "NSDate")]
        #[method(daylightSavingTimeOffset)]
        pub unsafe fn daylightSavingTimeOffset(&self) -> NSTimeInterval;

        #[cfg(feature = "NSDate")]
        #[method_id(@__retain_semantics Other nextDaylightSavingTimeTransition)]
        pub unsafe fn nextDaylightSavingTimeTransition(&self) -> Option<Retained<NSDate>>;

        #[cfg(feature = "NSString")]
        #[method_id(@__retain_semantics Other description)]
        pub unsafe fn description(&self) -> Retained<NSString>;

        #[method(isEqualToTimeZone:)]
        pub unsafe fn isEqualToTimeZone(&self, a_time_zone: &NSTimeZone) -> bool;

        #[cfg(all(feature = "NSLocale", feature = "NSString"))]
        #[method_id(@__retain_semantics Other localizedName:locale:)]
        pub unsafe fn localizedName_locale(
            &self,
            style: NSTimeZoneNameStyle,
            locale: Option<&NSLocale>,
        ) -> Option<Retained<NSString>>;
    }
);

extern_methods!(
    /// NSTimeZoneCreation
    unsafe impl NSTimeZone {
        #[cfg(feature = "NSString")]
        #[method_id(@__retain_semantics Other timeZoneWithName:)]
        pub unsafe fn timeZoneWithName(tz_name: &NSString) -> Option<Retained<Self>>;

        #[cfg(all(feature = "NSData", feature = "NSString"))]
        #[method_id(@__retain_semantics Other timeZoneWithName:data:)]
        pub unsafe fn timeZoneWithName_data(
            tz_name: &NSString,
            a_data: Option<&NSData>,
        ) -> Option<Retained<Self>>;

        #[cfg(feature = "NSString")]
        #[method_id(@__retain_semantics Init initWithName:)]
        pub unsafe fn initWithName(
            this: Allocated<Self>,
            tz_name: &NSString,
        ) -> Option<Retained<Self>>;

        #[cfg(all(feature = "NSData", feature = "NSString"))]
        #[method_id(@__retain_semantics Init initWithName:data:)]
        pub unsafe fn initWithName_data(
            this: Allocated<Self>,
            tz_name: &NSString,
            a_data: Option<&NSData>,
        ) -> Option<Retained<Self>>;

        #[method_id(@__retain_semantics Other timeZoneForSecondsFromGMT:)]
        pub unsafe fn timeZoneForSecondsFromGMT(seconds: NSInteger) -> Retained<Self>;

        #[cfg(feature = "NSString")]
        #[method_id(@__retain_semantics Other timeZoneWithAbbreviation:)]
        pub unsafe fn timeZoneWithAbbreviation(abbreviation: &NSString) -> Option<Retained<Self>>;
    }
);

extern "C" {
    #[cfg(all(feature = "NSNotification", feature = "NSString"))]
    pub static NSSystemTimeZoneDidChangeNotification: &'static NSNotificationName;
}
