package code;
import java.io.IOException;
import java.util.Hashtable;
import java.util.Iterator;

import org.json.JSONException;
import org.json.JSONObject;

public class Automa {
	private JSONObject jsonObject; //tabella che descrive l'automa
	private Hashtable<String,Integer> deltaSensori; // ad ogni sensore di movimento e' associato il valore di delta
	private int statoAttuale;
	private String statoInterruttore;
	private String statoSuono;
	private static final String FILE_AUTOMA = Antifurto.PATH_BB + "/res/automa.json";
	public static final String FILE_STATO = Antifurto.PATH_BB + "/res/stato.json";
	public static final String FILE_DELTA_SENSORI = Antifurto.PATH_BB + "/res/CONF/deltaSensoriMovimento.json";
	
	
	public Automa() throws JSONException, IOException {
		this.jsonObject = new JSONObject(Helper.leggiFile(FILE_AUTOMA));
		setStati(false);
		riempiHashTable();
		
	}
	
	
	private synchronized void setStati(boolean write) throws JSONException, IOException {
		JSONObject statoJson = new JSONObject(Helper.leggiFile(FILE_STATO)); 
		if(write) {
			// devo aggiornare lo stato nel FILE_STATO
			Helper.scriviFile(statoJson.put("stato",this.statoAttuale), FILE_STATO);
		}
		else {
			// devo capire in quale stato mi trovo e impostare di conseguenza lo statoInterruttore e lo statoSuono
			this.statoAttuale = statoJson.getInt("stato");
		}
		aggiornaInterruttoreESuono();
	}
	
	
	private void riempiHashTable() throws JSONException, IOException {
		this.deltaSensori = new Hashtable<String, Integer>();
		JSONObject jsObj = new JSONObject(Helper.leggiFile(FILE_DELTA_SENSORI));
		@SuppressWarnings("unchecked")
		Iterator<String> keys = jsObj.keys();
		while(keys.hasNext()) {
			String key = keys.next();
			int value = jsObj.getInt(key);
			deltaSensori.put(key, value);
		}
	}
	
	public void addDeltaSensori(String nomeSensore, int delta) {
		deltaSensori.put(nomeSensore, delta);
	}
	

	
	public int getDelta(String nomeSensore) {
		return deltaSensori.get(nomeSensore);
	}
	
	
	// e' cambiato lo stato dell'interruttore, per cui cerco nel file json in quale nuovo stato devo andare
	private synchronized void calcolaNuovoStatoMsgFromInterruttore(String newStatoInterruttore) throws JSONException, IOException {
		@SuppressWarnings("unchecked")
		Iterator<String> keys = jsonObject.keys();
		while(keys.hasNext()) {
			String key = keys.next();
			JSONObject riga = jsonObject.getJSONObject(key);
			if(riga.getInt("stato")==statoAttuale) {
				this.statoAttuale = riga.getInt("cmd"+newStatoInterruttore);
				setStati(true); //scrivo nel file il nuovo stato in cui mi trovo
			}
		}
	}
	//in base allo stato attuale dell'antifurto, calcolo lo stato dell'interruttore e del suono
	public synchronized void aggiornaInterruttoreESuono() throws JSONException {
		@SuppressWarnings("unchecked")
		Iterator<String> keys = jsonObject.keys();
		while(keys.hasNext()) {
			String key = keys.next();
			JSONObject riga = jsonObject.getJSONObject(key);
			if(riga.getInt("stato")==statoAttuale) {
				this.statoInterruttore = riga.getString("out0");
				this.statoSuono = riga.getString("out1");
			}
		}
	}
	
	// e' cambiato lo stato del suono, per cui cerco nel file json in quale nuovo stato devo andare
	private synchronized void calcolaNuovoStatoMsgFromSuono(String newStatoSuono) throws JSONException, IOException {
		String jsonKey = "";
		if(newStatoSuono.equals("on"))
			jsonKey = "eventValMaggioreSoglia";
		else
			jsonKey = "eventValMinoreSoglia";
		@SuppressWarnings("unchecked")
		Iterator<String> keys = jsonObject.keys();
		while(keys.hasNext()) {
			String key = keys.next();
			JSONObject riga = jsonObject.getJSONObject(key);
			if(riga.getInt("stato")==statoAttuale) {
				this.statoAttuale = riga.getInt(jsonKey);
				setStati(true); //scrivo nel file il nuovo stato in cui mi trovo
			}
		}
	}
	
	
	public synchronized void changeStatoInterruttore() throws JSONException, IOException {
		if(statoInterruttore.equals("on"))
			calcolaNuovoStatoMsgFromInterruttore("off");
		else 
			calcolaNuovoStatoMsgFromInterruttore("on");
	}
	
	public synchronized void aggiornaStatoSuono(String newStatoSuono) throws JSONException, IOException {
		calcolaNuovoStatoMsgFromSuono(newStatoSuono);
	}
	
	
	public synchronized int getStatoAutoma() {
		return statoAttuale;
	}
	
	public synchronized void setStatoAutoma(int newStato) {
		statoAttuale = newStato;
	}
	
	
	public synchronized String getStatoInterruttore() {
		return statoInterruttore;
	}
	
	
	public synchronized String getStatoSuono() {
		return statoSuono;
	}
	
	public synchronized boolean getStatoSuonoTrueFalse() {
		return statoSuono.equals("on");
	}
	
	public synchronized boolean getStatoInterrutoreTrueFalse() {
		return statoInterruttore.equals("on");
	}
	
	
	// Ritorna true se l'antifurto e' attivo
	public synchronized boolean antifurtoAttivo() {
		if(statoInterruttore.equals("on"))
			return true;
		return false;
	}
	
	// Ritorna true se l'antifurto sta suonando
	public synchronized boolean allarme() {
		if(statoSuono.equals("on"))
			return true;
		return false;
	}
	
	
	// con input la stringa "0" restituisce "off"
	// con input la stringa "1" restituisce "on"
	public String converter(int num) {
		if(num==0)
			return "off";
		return "on";
	}
}