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

namespace CPF.Mac.CoreImage
{
	[Register("CIFaceFeature", true)]
	public class CIFaceFeature : CIFeature
	{
		private static readonly IntPtr selHasLeftEyePositionHandle = Selector.GetHandle("hasLeftEyePosition");

		private static readonly IntPtr selLeftEyePositionHandle = Selector.GetHandle("leftEyePosition");

		private static readonly IntPtr selHasRightEyePositionHandle = Selector.GetHandle("hasRightEyePosition");

		private static readonly IntPtr selRightEyePositionHandle = Selector.GetHandle("rightEyePosition");

		private static readonly IntPtr selHasMouthPositionHandle = Selector.GetHandle("hasMouthPosition");

		private static readonly IntPtr selMouthPositionHandle = Selector.GetHandle("mouthPosition");

		private static readonly IntPtr selHasTrackingIDHandle = Selector.GetHandle("hasTrackingID");

		private static readonly IntPtr selTrackingIDHandle = Selector.GetHandle("trackingID");

		private static readonly IntPtr selHasTrackingFrameCountHandle = Selector.GetHandle("hasTrackingFrameCount");

		private static readonly IntPtr selTrackingFrameCountHandle = Selector.GetHandle("trackingFrameCount");

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

		public override IntPtr ClassHandle => class_ptr;

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

		public virtual CGPoint LeftEyePosition
		{
			[Export("leftEyePosition")]
			get
			{
				if (IsDirectBinding)
				{
					return Messaging.CGPoint_objc_msgSend(base.Handle, selLeftEyePositionHandle);
				}
				return Messaging.CGPoint_objc_msgSendSuper(base.SuperHandle, selLeftEyePositionHandle);
			}
		}

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

		public virtual CGPoint RightEyePosition
		{
			[Export("rightEyePosition")]
			get
			{
				if (IsDirectBinding)
				{
					return Messaging.CGPoint_objc_msgSend(base.Handle, selRightEyePositionHandle);
				}
				return Messaging.CGPoint_objc_msgSendSuper(base.SuperHandle, selRightEyePositionHandle);
			}
		}

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

		public virtual CGPoint MouthPosition
		{
			[Export("mouthPosition")]
			get
			{
				if (IsDirectBinding)
				{
					return Messaging.CGPoint_objc_msgSend(base.Handle, selMouthPositionHandle);
				}
				return Messaging.CGPoint_objc_msgSendSuper(base.SuperHandle, selMouthPositionHandle);
			}
		}

		[Since(6, 0)]
		public virtual bool HasTrackingId
		{
			[Export("hasTrackingID")]
			get
			{
				if (IsDirectBinding)
				{
					return Messaging.bool_objc_msgSend(base.Handle, selHasTrackingIDHandle);
				}
				return Messaging.bool_objc_msgSendSuper(base.SuperHandle, selHasTrackingIDHandle);
			}
		}

		[Since(6, 0)]
		public virtual int TrackingId
		{
			[Export("trackingID")]
			get
			{
				if (IsDirectBinding)
				{
					return Messaging.int_objc_msgSend(base.Handle, selTrackingIDHandle);
				}
				return Messaging.int_objc_msgSendSuper(base.SuperHandle, selTrackingIDHandle);
			}
		}

		[Since(6, 0)]
		public virtual bool HasTrackingFrameCount
		{
			[Export("hasTrackingFrameCount")]
			get
			{
				if (IsDirectBinding)
				{
					return Messaging.bool_objc_msgSend(base.Handle, selHasTrackingFrameCountHandle);
				}
				return Messaging.bool_objc_msgSendSuper(base.SuperHandle, selHasTrackingFrameCountHandle);
			}
		}

		[Since(6, 0)]
		public virtual int TrackingFrameCount
		{
			[Export("trackingFrameCount")]
			get
			{
				if (IsDirectBinding)
				{
					return Messaging.int_objc_msgSend(base.Handle, selTrackingFrameCountHandle);
				}
				return Messaging.int_objc_msgSendSuper(base.SuperHandle, selTrackingFrameCountHandle);
			}
		}

		[EditorBrowsable(EditorBrowsableState.Advanced)]
		[Export("initWithCoder:")]
		public CIFaceFeature(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 CIFaceFeature(NSObjectFlag t)
			: base(t)
		{
		}

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