using System;
using CoreGraphics;
using Foundation;
using Shared.IO;
using UIKit;


namespace Shared
{
	/// <summary>
	/// 色板
	/// </summary>
	public class ColorPicker :View
	{
		MyUIImageView myUIImageView
		{
			get
			{
				return uiView as MyUIImageView;
			}
			set
			{
				uiView = value;
			}
		}

        /// <summary>
        /// Initializes a new instance of the <see cref="Shared.Button"/> class.
        /// </summary>
        public ColorPicker()
        {
            myUIImageView = new MyUIImageView(this) { };
          
        }

		public override void Refresh()
		{
			base.Refresh();
			//Width = (int)myUIImageView.Image.Size.Width;
			//Height = (int)myUIImageView.Image.Size.Height;
		}

		string colorImagePath;
		/// <summary>
		/// 色板图
		/// </summary>
		/// <value>The color image path.</value>
		public string ColorImagePath
		{
			get {
				return colorImagePath;
			}
			set
			{
				colorImagePath = value;

                myUIImageView.Image = UIImage.FromFile(FileUtils.GetImageFilePath(colorImagePath));
			}
		}

        /// <summary>
        /// 颜色变化
        /// </summary>
        public Action<View, byte[]> ColorChaged;

		class MyUIImageView : UIImageView
		{
            [Weak] ColorPicker colorPicker;
			public MyUIImageView(ColorPicker colorPicker)
			{
                this.colorPicker = colorPicker;
				UserInteractionEnabled = true;
			}


            /// <summary>
            /// 点击开始
            /// </summary>
            /// <param name="touches">Touches.</param>
            /// <param name="evt">Evt.</param>
            public override void TouchesBegan(NSSet touches, UIEvent evt)
            {
                colorPicker?.TouchEvent(EventActions.Down,(touches.AnyObject as UITouch).LocationInView(this) );
				colorChaged(colorAtPixel((touches.AnyObject as UITouch).LocationInView(this)));
            }
            /// <summary>
            ///  移动
            /// </summary>
            /// <param name="touches">Touches.</param>
            /// <param name="evt">Evt.</param>
            public override void TouchesMoved(NSSet touches, UIEvent evt)
            {
                colorPicker?.TouchEvent(EventActions.Move,(touches.AnyObject as UITouch).LocationInView(this));
				colorChaged(colorAtPixel((touches.AnyObject as UITouch).LocationInView(this)));
            }

            /// <summary>
            /// 点击弹起
            /// </summary>
            /// <param name="touches">Touches.</param>
            /// <param name="evt">Evt.</param>
            public override void TouchesEnded(NSSet touches, UIEvent evt)
            {
                colorPicker?.TouchEvent(EventActions.Up,(touches.AnyObject as UITouch).LocationInView(this));
				colorChaged(colorAtPixel((touches.AnyObject as UITouch).LocationInView(this)));
            }

            public override void TouchesCancelled(NSSet touches, UIEvent evt)
            {
                colorPicker?.TouchEvent(EventActions.Cancel, (touches.AnyObject as UITouch).LocationInView(this));
            }

         
            void colorChaged(UIColor uiColor)
			{
				nfloat r, g, b, a;
				uiColor.GetRGBA(out r, out g, out b, out a);
				if (r == 0 && g == 0 && b == 0)
				{
					return;
				}
               colorPicker?.ColorChaged?.Invoke(colorPicker,new byte[] { (byte)(r * 255), (byte)(g * 255), (byte)(b * 255) });
			}

			UIColor colorAtPixel(CGPoint point)
			{
				var pointX = (int)(point.X *Image.Size.Width/ Frame.Width);
				var pointY = (int)(point.Y * Image.Size.Height / Frame.Height);

                if (Image.Size.Width < pointX) {
                    pointX = (int)Image.Size.Width;
                }

                if (Image.Size.Height < pointY) {
                    pointY = (int)Image.Size.Height;
                }
				var cgImage = Image.CGImage;
				var colorSpace = CGColorSpace.CreateDeviceRGB();
				int bytesPerPixel = 4;
				int bytesPerRow = bytesPerPixel * 1;
				var bitsPerComponent = 8;
				byte[] pixelData = { 0, 0, 0, 0 };
				var context = new CGBitmapContext(pixelData,
															 1,
															 1,
															 bitsPerComponent,
															 bytesPerRow,
												 colorSpace, CGBitmapFlags.PremultipliedLast | CGBitmapFlags.ByteOrder32Big);

				context.SetBlendMode(CGBlendMode.Copy);

				context.TranslateCTM(-pointX, pointY - Image.Size.Height);
				context.DrawImage(new CGRect(0.0f, 0.0f, Image.Size.Width, Image.Size.Height), cgImage);
				var red = pixelData[0] / 255.0f;
				var green = pixelData[1] / 255.0f;
				var blue = pixelData[2] / 255.0f;
				var alpha = pixelData[3] / 255.0f;
				return UIColor.FromRGBA(red, green, blue, alpha);
			}
		}

	}

}