using System;

namespace InnovatorAdmin.ColorTheory
{
	/// <summary>
	/// Structure to define CMYK.
	/// </summary>
	public struct CMYK
	{
		/// <summary>
		/// Gets an empty CMYK structure;
		/// </summary>
		public readonly static CMYK Empty = new CMYK();

		#region Fields
		private double c;
		private double m;
		private double y;
		private double k;
		#endregion

		#region Operators
		public static bool operator ==(CMYK item1, CMYK item2)
		{
			return (
				item1.Cyan == item2.Cyan
				&& item1.Magenta == item2.Magenta
				&& item1.Yellow == item2.Yellow
				&& item1.Black == item2.Black
				);
		}

		public static bool operator !=(CMYK item1, CMYK item2)
		{
			return (
				item1.Cyan != item2.Cyan
				|| item1.Magenta != item2.Magenta
				|| item1.Yellow != item2.Yellow
				|| item1.Black != item2.Black
				);
		}


		#endregion

		#region Accessors
		public double Cyan
		{
			get
			{
				return c;
			}
			set
			{
				c = value;
				c = (c>1)? 1 : ((c<0)? 0 : c);
			}
		}

		public double Magenta
		{
			get
			{
				return m;
			}
			set
			{
				m = value;
				m = (m>1)? 1 : ((m<0)? 0 : m);
			}
		}

		public double Yellow
		{
			get
			{
				return y;
			}
			set
			{
				y = value;
				y = (y>1)? 1 : ((y<0)? 0 : y);
			}
		}

		public double Black
		{
			get
			{
				return k;
			}
			set
			{
				k = value;
				k = (k>1)? 1 : ((k<0)? 0 : k);
			}
		}
		#endregion

		/// <summary>
		/// Creates an instance of a CMYK structure.
		/// </summary>
		public CMYK(double c, double m, double y, double k)
		{
			this.c = c;
			this.m = m;
			this.y = y;
			this.k = k;
		}

		#region Methods
		public override bool Equals(Object obj)
		{
			if(obj==null || GetType()!=obj.GetType()) return false;

			return (this == (CMYK)obj);
		}

		public override int GetHashCode()
		{
			return Cyan.GetHashCode() ^ Magenta.GetHashCode() ^ Yellow.GetHashCode() ^ Black.GetHashCode();
		}

		#endregion
	}
}
