using System;
using System.Drawing;

/// <summary>Представление цвета в пространстве CMYK</summary>
public struct CMYK
{
	byte cyan;
    byte magenta;
    byte yellow;
    byte black;

	public CMYK(byte cyan, byte magenta, byte yellow, byte black)
	{
		if (cyan + black > 255)
			throw new ArgumentOutOfRangeException("Значение C+B не должно превышать 255");
		if (magenta + black > 255)
			throw new ArgumentOutOfRangeException("Значение M+B не должно превышать 255");
		if (yellow + black > 255)
			throw new ArgumentOutOfRangeException("Значение Y+B не должно превышать 255");
		this.cyan = cyan;
		this.magenta = magenta;
		this.yellow = yellow;
		this.black = black;
	}

    public CMYK(CMY cmy)
    {
		black = Math.Min(cmy.C, Math.Min(cmy.Y, cmy.M));
		this.cyan = (byte)(cmy.C - black);
        this.magenta = (byte)(cmy.M - black);
        this.yellow = (byte)(cmy.Y - black);
    }

    /// <summary>Конструктор для преобразования цвета из пространства RGB</summary>
    /// <param name="rgb">Цвет в пространстве RGB</param>
    public CMYK(Color rgb)
    {
        this.cyan = (byte)(255 - rgb.R);
        this.magenta = (byte)(255 - rgb.G);
        this.yellow = (byte)(255 - rgb.B);
        black = Math.Min(cyan, Math.Min(yellow, magenta)); 
        cyan -= black;
        magenta -= black;
        yellow -= black;
    }

    /// <summary>Преобразование цвета из пространства CMYK в пространство RGB</summary>
    /// <param name="cmyk">Цвет в пространстве CMYK</param>
    /// <returns>Цвет в пространстве RGB</returns>
    public static implicit operator Color(CMYK cmyk)
    {
        return Color.FromArgb(255 - cmyk.cyan - cmyk.black,
                              255 - cmyk.magenta - cmyk.black,
                              255 - cmyk.yellow - cmyk.black);
    }

    public static implicit operator CMYK(Color color)
    {
        return new CMYK(color);
    }

	public byte C
	{
		get { return cyan; }
	}

    public byte M
    {
        get { return magenta; }
    }

    public byte Y
    {
        get { return yellow; }
    }

    public byte K
    {
        get { return black; }
    }

    public override string ToString()
    {
        return string.Format("CMYK({0}, {1}, {2}, {3})", cyan, magenta, yellow, black);
    }
}