package de.heatup.timers;

import java.util.HashMap;
import java.util.Map;

import de.heatup.cfg.Config;
import de.heatup.logging.Logger;
import de.heatup.ui.StatusPanelAdder;
import de.heatup.ui.actionPanel.HardewareManipulate;

public class HardwareResetTimers {
	private static int tickCount = 0;
	private static int tickRoundMax = 10000;
	private static int nrOfTicksUntilReset = 900; /* entspricht 15 sekunden ingame zeit (nicht unbedingt echtzeit!); berechnet durch 15*targetTickRate im Gameloop. */ 
	private static Map<Character, Integer> HardwareResetTickstamps = new HashMap<Character, Integer>();
	private static Map<Character, Integer> HardwareCooldownTimestamps = new HashMap<Character, Integer>();
	/**
	 * Zählt ticks und resettet somit Spielzeit orientiert die Hardware-Objekte.
	 */
	public static void tick() {
		tickCount++;
		if (tickCount>=tickRoundMax) {
			tickCount = 0;
		}
		for (char i = Config.firstHardwareChar; i<=Config.lastHardwareChar; i++) {
			if (HardwareResetTickstamps.containsKey(i)) {
				if (HardwareResetTickstamps.get(i).equals(tickCount)) {
					Logger.write("Hardware "+i+" cools down");
					StatusPanelAdder.reduceMod();
				}
			}
		}
		for (char i = Config.firstHardwareChar; i<=Config.lastHardwareChar; i++) {
			if (HardwareCooldownTimestamps.containsKey(i)) {
				if (HardwareCooldownTimestamps.get(i).equals(tickCount)) {
					Logger.write("Hardware "+i+" can be manipulated again");
					HardewareManipulate.resetHardware(i);
				}
			}
		}
	}
	/**
	 * Setzt das gegebene Hardware-Objekt auf "manipuliert" und merkt sich den aktuellen Tick + Resetzeit = Tick an dem resettet werden muss,
	 * sowie aktueller Tick + 2*Resetzeit als Cooldown.
	 * @param c Hardware-Objekt, welches als manipuliert gelten soll.
	 */
	public static void setManipulated(char c) {
		int resetTimestamp = tickCount+nrOfTicksUntilReset;
		int cooldownTimestamp = tickCount+2*nrOfTicksUntilReset;
		if (resetTimestamp > tickRoundMax) {
			resetTimestamp = resetTimestamp % tickRoundMax;
		}
		if (cooldownTimestamp > tickRoundMax) {
			cooldownTimestamp = cooldownTimestamp % tickRoundMax;
		}
		HardwareResetTickstamps.put(c, resetTimestamp);
		HardwareCooldownTimestamps.put(c, cooldownTimestamp);
		StatusPanelAdder.raiseMod();
		StatusPanelAdder.addManipulations();
	}
}
