package com.armadialogcreator.control.impl.utility;

import com.armadialogcreator.control.ArmaControlRenderer;
import com.armadialogcreator.core.ConfigPropertyLookup;
import com.armadialogcreator.core.ConfigPropertyLookupConstant;
import com.armadialogcreator.core.sv.SVNumericValue;
import javafx.scene.canvas.GraphicsContext;
import org.jetbrains.annotations.NotNull;

/**
 Handles blinking period (commonly associated with
 {@link ConfigPropertyLookup#BLINKING_PERIOD}).

 @author Kayler
 @since 11/22/2016 */
public class BlinkControlHandler {
	private double blinkDuration;
	private boolean blinkDurationSet = false;
	private long lastPaint;
	private boolean blinkIn = false;
	private long blinkDurationPast = 0;

	public BlinkControlHandler(@NotNull ArmaControlRenderer renderer, @NotNull ConfigPropertyLookupConstant constant) {
		renderer.addValueListener(constant, (observer, oldValue, newValue) -> {
			if (newValue == null || !(newValue instanceof SVNumericValue)) {
				blinkDurationSet = false;
			} else {
				blinkDuration = ((SVNumericValue) newValue).toDouble() * 1000; //*1000 because its in millis
				if (blinkDuration <= 0) {
					blinkDurationSet = false;
					return;
				}
				blinkDurationSet = true;
			}
		});
	}

	/**
	 Will manipulate {@link GraphicsContext#getGlobalAlpha()} based on an internal clock.
	 */
	public void paint(@NotNull GraphicsContext gc) {
		long now = System.currentTimeMillis();
		long timePast = now - lastPaint;
		lastPaint = now;

		if (!blinkDurationSet) {
			return;
		}

		if (blinkIn) {
			blinkDurationPast += timePast;
			if (blinkDurationPast >= blinkDuration) {
				blinkIn = false;
				blinkDurationPast = (long) blinkDuration;
			}
		} else {
			blinkDurationPast -= timePast;
			if (blinkDurationPast <= 0) {
				blinkIn = true;
				blinkDurationPast = 0;
			}
		}
		gc.setGlobalAlpha(blinkDurationPast / blinkDuration);
	}
}