package rainbowPackage;

import javafx.scene.paint.Color;

public class ColorDecide
{
	//VibrantColors vibrantColors = new VibrantColors();
	//public boolean SomeTargetColorHit = true;
	private final Color simpleBlue = Color.rgb(0,0,255);
	private final Color simpleRed = Color.rgb(255,0,0);
	private Color fxColor = Color.BEIGE;
	private RainbowSoftColor rainbowSoftColor = new RainbowSoftColor( new double[]{0,0,0,1} );
	private ColorTooSimilar colorTooSimilarFunction = new ColorTooSimilar();

	public final Color NextColorDecide ( Color BasisColor, Color BackgroundBasisColor, Color PatternColor, Color BrowserColor, Color InitialColorContrastingChoice, Color ColorTooSimilarReplacementColor, double ColorDifference, boolean SomeTargetColorHit, boolean FinalNotReversed, boolean NextStepColorTooSimilarEffect, boolean InvertBasisFromBackground )
	{
		/*if (  PatternColor.getRed() == 4 / 255 && PatternColor.getGreen() == 1 / 255 && PatternColor.getBlue() == 3 / 255 )// && PatternColor.getOpacity() == 0 )
		{
			rainbowSoftColor = new RainbowSoftColor( vibrantColors.Clear );
			fxColor = rainbowSoftColor.ToFXColor();
			return vibrantColors.Clear;
		}// */
		//if ( SomeTargetColorHit && !FinalNotReversed )
		//	return PatternColor.invert();
		if ( ( SomeTargetColorHit || FinalNotReversed ) && ( BasisColor.getOpacity() == BackgroundBasisColor.getOpacity() && 
				BasisColor.getRed() == BackgroundBasisColor.getRed() && 
				BasisColor.getGreen() == BackgroundBasisColor.getGreen() && 
				BasisColor.getBlue() == BackgroundBasisColor.getBlue() ) )
		{
			/*if ( browserHit && BrowserColor.getOpacity() == vibrantColors.Magenta.getOpacity() && 
						BrowserColor.getRed() == vibrantColors.Magenta.getRed() && 
						BrowserColor.getGreen() == vibrantColors.Magenta.getGreen() && 
						BrowserColor.getBlue() == vibrantColors.Magenta.getBlue() )
				{
					if ( !NextStepColorTooSimilarEffect )//!NextStepColorTooSimilarEffect For ShortCutting To Show Full Basis Below & Putting Browser Picture Over Anything And Stuff Like That Like An Emergency Auxiliary To Show Pixels. reversalOfBackgroundEffectsSlave Does Not Work When !NextStepColorTooSimilarEffect,
					{
						rainbowSoftColor = new RainbowSoftColor( PatternColor );
						rgb = rainbowSoftColor.rgb;
						argb = rainbowSoftColor.argb;
						fxColor = rainbowSoftColor.ToFXColor();// [#]/
						return PatternColor;
					}
					else if ( !rainbowSoftColor.ColorTooSimilarFunction( BrowserColor, PatternColor, ColorDifference ) )//&& reversalOfBackgroundEffectsSlave )
					{
						rainbowSoftColor = new RainbowSoftColor( PatternColor );
						rgb = rainbowSoftColor.rgb;
						argoftColor.argb;
						fxColor = rainbowSoftColor.ToFXColor();// [#]/
						return PatternColor;
					}
					else if( InvertBasisFromBackground  )//&& reversalOfBackgroundEffectsSlave )
					{
						rainbowSoftColor = new RainbowSoftColor( PatternColor );
						rgb = rainbowSoftColor.rgb;
						argb = rainbowSoftColor.argb;
						fxColor = rainbowSoftColor.ToFXColor();
						fxColor = fxColor.invert();//32 Bit Support Necessary To Maintain Cubical Cellular Modularity To Get This Reprocessed Through NextColorDecide Jump Past This then And Goto Next else
						rainbowSoftColor = new RainbowSoftColor( new double[] { 255 * fxColor.getRed(), 255 * fxColor.getGreen(), 255 * fxColor.getBlue(), fxColor.getOpacity() } );
						rgb = rainbowSoftColor.rgb;
						argb = rainbowSoftColor.argb;
						fxColor = rainbowSoftColor.ToFXColor();// [#]/
						return fxColor;
					}
					else
					{
						rainbowSoftColor.RainbowSoftColorFunction(2, 1, BrowserColor, PatternColor );
						if ( !colorTooSimilarFunction.ColorTooSimilarFunction( InitialColorContrastingChoice, rainbowSoftColor.ToFXColor(), ColorDifference ) )
						{
							rainbowSoftColor = new RainbowSoftColor( InitialColorContrastingChoice );
							rgb = rainbowSoftColor.rgb;
							argb = rainbowSoftColor.argb;
							fxColor = rainbowSoftColor.ToFXColor();// [#]/
							return InitialColorContrastingChoice;
						}
						else
						{
							rainbowSoftColor = new RainbowSoftColor( ColorTooSimilarReplacementColor );
							rgb = rainbowSoftColor.rgb;
							argb = rainbowSoftColor.argb;
							fxColor = rainbowSoftColor.ToFXColor();// [#]/
							return ColorTooSimilarReplacementColor;
						}
					}
				}
				else//*/
			//{
			////rainbowSoftColor.set( PatternColor );
			//rgb = rainbowSoftColor.rgb;
			//argb = rainbowSoftColor.argb;
			//fxColor = rainbowSoftColor.ToFXColor();// */
			return PatternColor;
			//}
		}
		else if ( !SomeTargetColorHit && FinalNotReversed )
		{
			//rainbowSoftColor.set( BasisColor );
			//rgb = rainbowSoftColor.rgb;
			//argb = rainbowSoftColor.argb;
			//fxColor = rainbowSoftColor.ToFXColor();// #/
			return BasisColor;
		}// */
		else if ( !NextStepColorTooSimilarEffect )//!NextStepColorTooSimilarEffect For ShortCutting To Show Full Basis Below & Putting Browser Picture Over Anything And Stuff Like That Like An Emergency Auxiliary To Show Pixels. reversalOfBackgroundEffectsSlave Does Not Work When !NextStepColorTooSimilarEffect,
		{
			//rainbowSoftColor.set( PatternColor );
			//rgb = rainbowSoftColor.rgb;
			//argb = rainbowSoftColor.argb;
			//fxColor = rainbowSoftColor.ToFXColor();// */
			return PatternColor;
		}
		else if ( !rainbowSoftColor.ColorTooSimilarFunction( BasisColor, PatternColor, ColorDifference ) )//&& reversalOfBackgroundEffectsSlave )
		{
			//rainbowSoftColor.set( PatternColor );
			//rgb = rainbowSoftColor.rgb;
			//argb = rainbowSoftColor.argb;
			//fxColor = rainbowSoftColor.ToFXColor();// */
			return PatternColor;
		}
		//else if ( rainbowSoftColor.ColorTooSimilarFunction( PatternColor, vibrantColors.HalfGrey, ColorDifference / 2 ) )
		//{
		//	rainbowSoftColor = new RainbowSoftColor( vibrantColors.Lime );
		//	fxColor = rainbowSoftColor.ToFXColor();
		//	return vibrantColors.Lime;
		//}
		else if ( InvertBasisFromBackground )//&& reversalOfBackgroundEffectsSlave )
		{
			//rainbowSoftColor.set( PatternColor );
			//rgb = rainbowSoftColor.rgb;
			//argb = rainbowSoftColor.argb;
			//fxColor = rainbowSoftColor.ToFXColor();
			//fxColor = fxColor.invert();//32 Bit Support Necessary To Maintain Cubical Cellular Modularity To Get This Reprocessed Through NextColorDecide Jump Past This then And Goto Next else
			//rainbowSoftColor.set( fxColor );
			//rainbowSoftColor = new RainbowSoftColor( new double[] { 255 * fxColor.getRed(), 255 * fxColor.getGreen(), 255 * fxColor.getBlue(), fxColor.getOpacity() } );
			//rgb = rainbowSoftColor.rgb;
			//argb = rainbowSoftColor.argb;
			//fxColor = rainbowSoftColor.ToFXColor();// */
			fxColor = PatternColor.invert();
			if ( !colorTooSimilarFunction.ColorTooSimilarFunction( fxColor, PatternColor, ColorDifference ) )
				return fxColor;
		}
		rainbowSoftColor.RainbowSoftColorFunction( 2, 1, BasisColor, PatternColor );
		if ( !colorTooSimilarFunction.ColorTooSimilarFunction( InitialColorContrastingChoice, rainbowSoftColor.ToFXColor(), ColorDifference ) )
		{
			//rainbowSoftColor.set( InitialColorContrastingChoice );
			//rgb = rainbowSoftColor.rgb;
			//argb = rainbowSoftColor.argb;
			//fxColor = rainbowSoftColor.ToFXColor();// */
			return InitialColorContrastingChoice;
		}
		else if ( !colorTooSimilarFunction.ColorTooSimilarFunction( ColorTooSimilarReplacementColor, rainbowSoftColor.ToFXColor(), ColorDifference ) )
		{
			//rainbowSoftColor.set( ColorTooSimilarReplacementColor );
			//rgb = rainbowSoftColor.rgb;
			//argb = rainbowSoftColor.argb;
			//fxColor = rainbowSoftColor.ToFXColor();// */
			return ColorTooSimilarReplacementColor;
		}
		else if ( !colorTooSimilarFunction.ColorTooSimilarFunction( simpleBlue, rainbowSoftColor.ToFXColor(), ColorDifference ) )
		{
			//rainbowSoftColor.set( simpleBlue );
			//rgb = rainbowSoftColor.rgb;
			//argb = rainbowSoftColor.argb;
			//fxColor = rainbowSoftColor.ToFXColor();// */
			return simpleBlue;
		}
		else
		{
			//rainbowSoftColor.set( simpleRed );
			//rgb = rainbowSoftColor.rgb;
			//argb = rainbowSoftColor.argb;
			//fxColor = rainbowSoftColor.ToFXColor();// */
			return simpleRed;
		}
		/*rainbowSoftColor = new RainbowSoftColor( vibrantColors.Maroon );
		//rgb = rainbowSoftColor.rgb;
		//argb = rainbowSoftColor.argb;
		fxColor = rainbowSoftColor.ToFXColor();
		return fxColor;// */
	}
}