using CPF.Mac.ObjCRuntime;
using System;
using System.ComponentModel;

namespace CPF.Mac.Foundation
{
	[Register("NSUserNotification", true)]
	[MountainLion]
	public class NSUserNotification : NSObject
	{
		private static readonly IntPtr selTitleHandle = Selector.GetHandle("title");

		private static readonly IntPtr selSetTitle_Handle = Selector.GetHandle("setTitle:");

		private static readonly IntPtr selSubtitleHandle = Selector.GetHandle("subtitle");

		private static readonly IntPtr selSetSubtitle_Handle = Selector.GetHandle("setSubtitle:");

		private static readonly IntPtr selInformativeTextHandle = Selector.GetHandle("informativeText");

		private static readonly IntPtr selSetInformativeText_Handle = Selector.GetHandle("setInformativeText:");

		private static readonly IntPtr selActionButtonTitleHandle = Selector.GetHandle("actionButtonTitle");

		private static readonly IntPtr selSetActionButtonTitle_Handle = Selector.GetHandle("setActionButtonTitle:");

		private static readonly IntPtr selUserInfoHandle = Selector.GetHandle("userInfo");

		private static readonly IntPtr selSetUserInfo_Handle = Selector.GetHandle("setUserInfo:");

		private static readonly IntPtr selDeliveryDateHandle = Selector.GetHandle("deliveryDate");

		private static readonly IntPtr selSetDeliveryDate_Handle = Selector.GetHandle("setDeliveryDate:");

		private static readonly IntPtr selDeliveryTimeZoneHandle = Selector.GetHandle("deliveryTimeZone");

		private static readonly IntPtr selSetDeliveryTimeZone_Handle = Selector.GetHandle("setDeliveryTimeZone:");

		private static readonly IntPtr selDeliveryRepeatIntervalHandle = Selector.GetHandle("deliveryRepeatInterval");

		private static readonly IntPtr selSetDeliveryRepeatInterval_Handle = Selector.GetHandle("setDeliveryRepeatInterval:");

		private static readonly IntPtr selActualDeliveryDateHandle = Selector.GetHandle("actualDeliveryDate");

		private static readonly IntPtr selIsPresentedHandle = Selector.GetHandle("isPresented");

		private static readonly IntPtr selIsRemoteHandle = Selector.GetHandle("isRemote");

		private static readonly IntPtr selSoundNameHandle = Selector.GetHandle("soundName");

		private static readonly IntPtr selSetSoundName_Handle = Selector.GetHandle("setSoundName:");

		private static readonly IntPtr selHasActionButtonHandle = Selector.GetHandle("hasActionButton");

		private static readonly IntPtr selSetHasActionButton_Handle = Selector.GetHandle("setHasActionButton:");

		private static readonly IntPtr selActivationTypeHandle = Selector.GetHandle("activationType");

		private static readonly IntPtr selOtherButtonTitleHandle = Selector.GetHandle("otherButtonTitle");

		private static readonly IntPtr selSetOtherButtonTitle_Handle = Selector.GetHandle("setOtherButtonTitle:");

		private static readonly IntPtr class_ptr = Class.GetHandle("NSUserNotification");

		private object __mt_UserInfo_var;

		private object __mt_DeliveryDate_var;

		private object __mt_DeliveryTimeZone_var;

		private object __mt_DeliveryRepeatInterval_var;

		private object __mt_ActualDeliveryDate_var;

		private static NSString _NSUserNotificationDefaultSoundName;

		public override IntPtr ClassHandle => class_ptr;

		public virtual string Title
		{
			[Export("title", ArgumentSemantic.Copy)]
			get
			{
				if (IsDirectBinding)
				{
					return NSString.FromHandle(Messaging.IntPtr_objc_msgSend(base.Handle, selTitleHandle));
				}
				return NSString.FromHandle(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selTitleHandle));
			}
			[Export("setTitle:", ArgumentSemantic.Copy)]
			set
			{
				if (value == null)
				{
					throw new ArgumentNullException("value");
				}
				IntPtr intPtr = NSString.CreateNative(value);
				if (IsDirectBinding)
				{
					Messaging.void_objc_msgSend_IntPtr(base.Handle, selSetTitle_Handle, intPtr);
				}
				else
				{
					Messaging.void_objc_msgSendSuper_IntPtr(base.SuperHandle, selSetTitle_Handle, intPtr);
				}
				NSString.ReleaseNative(intPtr);
			}
		}

		public virtual string Subtitle
		{
			[Export("subtitle", ArgumentSemantic.Copy)]
			get
			{
				if (IsDirectBinding)
				{
					return NSString.FromHandle(Messaging.IntPtr_objc_msgSend(base.Handle, selSubtitleHandle));
				}
				return NSString.FromHandle(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selSubtitleHandle));
			}
			[Export("setSubtitle:", ArgumentSemantic.Copy)]
			set
			{
				if (value == null)
				{
					throw new ArgumentNullException("value");
				}
				IntPtr intPtr = NSString.CreateNative(value);
				if (IsDirectBinding)
				{
					Messaging.void_objc_msgSend_IntPtr(base.Handle, selSetSubtitle_Handle, intPtr);
				}
				else
				{
					Messaging.void_objc_msgSendSuper_IntPtr(base.SuperHandle, selSetSubtitle_Handle, intPtr);
				}
				NSString.ReleaseNative(intPtr);
			}
		}

		public virtual string InformativeText
		{
			[Export("informativeText", ArgumentSemantic.Copy)]
			get
			{
				if (IsDirectBinding)
				{
					return NSString.FromHandle(Messaging.IntPtr_objc_msgSend(base.Handle, selInformativeTextHandle));
				}
				return NSString.FromHandle(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selInformativeTextHandle));
			}
			[Export("setInformativeText:", ArgumentSemantic.Copy)]
			set
			{
				if (value == null)
				{
					throw new ArgumentNullException("value");
				}
				IntPtr intPtr = NSString.CreateNative(value);
				if (IsDirectBinding)
				{
					Messaging.void_objc_msgSend_IntPtr(base.Handle, selSetInformativeText_Handle, intPtr);
				}
				else
				{
					Messaging.void_objc_msgSendSuper_IntPtr(base.SuperHandle, selSetInformativeText_Handle, intPtr);
				}
				NSString.ReleaseNative(intPtr);
			}
		}

		public virtual string ActionButtonTitle
		{
			[Export("actionButtonTitle", ArgumentSemantic.Copy)]
			get
			{
				if (IsDirectBinding)
				{
					return NSString.FromHandle(Messaging.IntPtr_objc_msgSend(base.Handle, selActionButtonTitleHandle));
				}
				return NSString.FromHandle(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selActionButtonTitleHandle));
			}
			[Export("setActionButtonTitle:", ArgumentSemantic.Copy)]
			set
			{
				if (value == null)
				{
					throw new ArgumentNullException("value");
				}
				IntPtr intPtr = NSString.CreateNative(value);
				if (IsDirectBinding)
				{
					Messaging.void_objc_msgSend_IntPtr(base.Handle, selSetActionButtonTitle_Handle, intPtr);
				}
				else
				{
					Messaging.void_objc_msgSendSuper_IntPtr(base.SuperHandle, selSetActionButtonTitle_Handle, intPtr);
				}
				NSString.ReleaseNative(intPtr);
			}
		}

		public virtual NSDictionary UserInfo
		{
			[Export("userInfo", ArgumentSemantic.Copy)]
			get
			{
				return (NSDictionary)(__mt_UserInfo_var = ((!IsDirectBinding) ? ((NSDictionary)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selUserInfoHandle))) : ((NSDictionary)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend(base.Handle, selUserInfoHandle)))));
			}
			[Export("setUserInfo:", ArgumentSemantic.Copy)]
			set
			{
				if (value == null)
				{
					throw new ArgumentNullException("value");
				}
				if (IsDirectBinding)
				{
					Messaging.void_objc_msgSend_IntPtr(base.Handle, selSetUserInfo_Handle, value.Handle);
				}
				else
				{
					Messaging.void_objc_msgSendSuper_IntPtr(base.SuperHandle, selSetUserInfo_Handle, value.Handle);
				}
				__mt_UserInfo_var = value;
			}
		}

		public virtual NSDate DeliveryDate
		{
			[Export("deliveryDate", ArgumentSemantic.Copy)]
			get
			{
				return (NSDate)(__mt_DeliveryDate_var = ((!IsDirectBinding) ? ((NSDate)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selDeliveryDateHandle))) : ((NSDate)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend(base.Handle, selDeliveryDateHandle)))));
			}
			[Export("setDeliveryDate:", ArgumentSemantic.Copy)]
			set
			{
				if (value == null)
				{
					throw new ArgumentNullException("value");
				}
				if (IsDirectBinding)
				{
					Messaging.void_objc_msgSend_IntPtr(base.Handle, selSetDeliveryDate_Handle, value.Handle);
				}
				else
				{
					Messaging.void_objc_msgSendSuper_IntPtr(base.SuperHandle, selSetDeliveryDate_Handle, value.Handle);
				}
				__mt_DeliveryDate_var = value;
			}
		}

		public virtual NSTimeZone DeliveryTimeZone
		{
			[Export("deliveryTimeZone", ArgumentSemantic.Copy)]
			get
			{
				return (NSTimeZone)(__mt_DeliveryTimeZone_var = ((!IsDirectBinding) ? ((NSTimeZone)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selDeliveryTimeZoneHandle))) : ((NSTimeZone)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend(base.Handle, selDeliveryTimeZoneHandle)))));
			}
			[Export("setDeliveryTimeZone:", ArgumentSemantic.Copy)]
			set
			{
				if (value == null)
				{
					throw new ArgumentNullException("value");
				}
				if (IsDirectBinding)
				{
					Messaging.void_objc_msgSend_IntPtr(base.Handle, selSetDeliveryTimeZone_Handle, value.Handle);
				}
				else
				{
					Messaging.void_objc_msgSendSuper_IntPtr(base.SuperHandle, selSetDeliveryTimeZone_Handle, value.Handle);
				}
				__mt_DeliveryTimeZone_var = value;
			}
		}

		public virtual NSDateComponents DeliveryRepeatInterval
		{
			[Export("deliveryRepeatInterval", ArgumentSemantic.Copy)]
			get
			{
				return (NSDateComponents)(__mt_DeliveryRepeatInterval_var = ((!IsDirectBinding) ? ((NSDateComponents)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selDeliveryRepeatIntervalHandle))) : ((NSDateComponents)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend(base.Handle, selDeliveryRepeatIntervalHandle)))));
			}
			[Export("setDeliveryRepeatInterval:", ArgumentSemantic.Copy)]
			set
			{
				if (value == null)
				{
					throw new ArgumentNullException("value");
				}
				if (IsDirectBinding)
				{
					Messaging.void_objc_msgSend_IntPtr(base.Handle, selSetDeliveryRepeatInterval_Handle, value.Handle);
				}
				else
				{
					Messaging.void_objc_msgSendSuper_IntPtr(base.SuperHandle, selSetDeliveryRepeatInterval_Handle, value.Handle);
				}
				__mt_DeliveryRepeatInterval_var = value;
			}
		}

		public virtual NSDate ActualDeliveryDate
		{
			[Export("actualDeliveryDate")]
			get
			{
				return (NSDate)(__mt_ActualDeliveryDate_var = ((!IsDirectBinding) ? ((NSDate)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selActualDeliveryDateHandle))) : ((NSDate)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend(base.Handle, selActualDeliveryDateHandle)))));
			}
		}

		public virtual bool Presented
		{
			[Export("isPresented")]
			get
			{
				if (IsDirectBinding)
				{
					return Messaging.bool_objc_msgSend(base.Handle, selIsPresentedHandle);
				}
				return Messaging.bool_objc_msgSendSuper(base.SuperHandle, selIsPresentedHandle);
			}
		}

		public virtual bool Remote
		{
			[Export("isRemote")]
			get
			{
				if (IsDirectBinding)
				{
					return Messaging.bool_objc_msgSend(base.Handle, selIsRemoteHandle);
				}
				return Messaging.bool_objc_msgSendSuper(base.SuperHandle, selIsRemoteHandle);
			}
		}

		public virtual string SoundName
		{
			[Export("soundName")]
			get
			{
				if (IsDirectBinding)
				{
					return NSString.FromHandle(Messaging.IntPtr_objc_msgSend(base.Handle, selSoundNameHandle));
				}
				return NSString.FromHandle(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selSoundNameHandle));
			}
			[Export("setSoundName:")]
			set
			{
				if (value == null)
				{
					throw new ArgumentNullException("value");
				}
				IntPtr intPtr = NSString.CreateNative(value);
				if (IsDirectBinding)
				{
					Messaging.void_objc_msgSend_IntPtr(base.Handle, selSetSoundName_Handle, intPtr);
				}
				else
				{
					Messaging.void_objc_msgSendSuper_IntPtr(base.SuperHandle, selSetSoundName_Handle, intPtr);
				}
				NSString.ReleaseNative(intPtr);
			}
		}

		public virtual bool HasActionButton
		{
			[Export("hasActionButton")]
			get
			{
				if (IsDirectBinding)
				{
					return Messaging.bool_objc_msgSend(base.Handle, selHasActionButtonHandle);
				}
				return Messaging.bool_objc_msgSendSuper(base.SuperHandle, selHasActionButtonHandle);
			}
			[Export("setHasActionButton:")]
			set
			{
				if (IsDirectBinding)
				{
					Messaging.void_objc_msgSend_bool(base.Handle, selSetHasActionButton_Handle, value);
				}
				else
				{
					Messaging.void_objc_msgSendSuper_bool(base.SuperHandle, selSetHasActionButton_Handle, value);
				}
			}
		}

		public virtual NSUserNotificationActivationType ActivationType
		{
			[Export("activationType")]
			get
			{
				if (IsDirectBinding)
				{
					return (NSUserNotificationActivationType)Messaging.int_objc_msgSend(base.Handle, selActivationTypeHandle);
				}
				return (NSUserNotificationActivationType)Messaging.int_objc_msgSendSuper(base.SuperHandle, selActivationTypeHandle);
			}
		}

		public virtual string OtherButtonTitle
		{
			[Export("otherButtonTitle", ArgumentSemantic.Copy)]
			get
			{
				if (IsDirectBinding)
				{
					return NSString.FromHandle(Messaging.IntPtr_objc_msgSend(base.Handle, selOtherButtonTitleHandle));
				}
				return NSString.FromHandle(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selOtherButtonTitleHandle));
			}
			[Export("setOtherButtonTitle:", ArgumentSemantic.Copy)]
			set
			{
				if (value == null)
				{
					throw new ArgumentNullException("value");
				}
				IntPtr intPtr = NSString.CreateNative(value);
				if (IsDirectBinding)
				{
					Messaging.void_objc_msgSend_IntPtr(base.Handle, selSetOtherButtonTitle_Handle, intPtr);
				}
				else
				{
					Messaging.void_objc_msgSendSuper_IntPtr(base.SuperHandle, selSetOtherButtonTitle_Handle, intPtr);
				}
				NSString.ReleaseNative(intPtr);
			}
		}

		[Field("NSUserNotificationDefaultSoundName", "Foundation")]
		public static NSString NSUserNotificationDefaultSoundName
		{
			get
			{
				if (_NSUserNotificationDefaultSoundName == null)
				{
					_NSUserNotificationDefaultSoundName = Dlfcn.GetStringConstant(Libraries.Foundation.Handle, "NSUserNotificationDefaultSoundName");
				}
				return _NSUserNotificationDefaultSoundName;
			}
		}

		[EditorBrowsable(EditorBrowsableState.Advanced)]
		[Export("init")]
		public NSUserNotification()
			: base(NSObjectFlag.Empty)
		{
			if (IsDirectBinding)
			{
				base.Handle = Messaging.IntPtr_objc_msgSend(base.Handle, Selector.Init);
			}
			else
			{
				base.Handle = Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, Selector.Init);
			}
		}

		[EditorBrowsable(EditorBrowsableState.Advanced)]
		[Export("initWithCoder:")]
		public NSUserNotification(NSCoder coder)
			: base(NSObjectFlag.Empty)
		{
			if (IsDirectBinding)
			{
				base.Handle = Messaging.IntPtr_objc_msgSend_IntPtr(base.Handle, Selector.InitWithCoder, coder.Handle);
			}
			else
			{
				base.Handle = Messaging.IntPtr_objc_msgSendSuper_IntPtr(base.SuperHandle, Selector.InitWithCoder, coder.Handle);
			}
		}

		[EditorBrowsable(EditorBrowsableState.Advanced)]
		public NSUserNotification(NSObjectFlag t)
			: base(t)
		{
		}

		[EditorBrowsable(EditorBrowsableState.Advanced)]
		public NSUserNotification(IntPtr handle)
			: base(handle)
		{
		}

		protected override void Dispose(bool disposing)
		{
			base.Dispose(disposing);
			if (base.Handle == IntPtr.Zero)
			{
				__mt_UserInfo_var = null;
				__mt_DeliveryDate_var = null;
				__mt_DeliveryTimeZone_var = null;
				__mt_DeliveryRepeatInterval_var = null;
				__mt_ActualDeliveryDate_var = null;
			}
		}
	}
}
