package code;

import java.util.Date;
//import java.util.Iterator;

import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.MqttTopic;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
//import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.util.ArrayList;
//import java.util.Collections;

public class Luci {

	public static ArrayList<Luce> luciList;

	private static String brokerUrl;

	//private JSONObject jsonObject;
	//private final static String DATABASE_PATH = "./Luci.json";

	private static ArrayList<String> topicsSub;
	private String clientId = Long.toString(new Date().getTime()) + "-luci"; // unique client id
	private String mqttDomain;
	private String mqttSubdomain;
	private static String mqttTree;
	public static final String CONF_FOLDER = "../CONF/";
	private final static String FILE_CONF = CONF_FOLDER + "conf.json";// "./CONF/conf.json";
	// private final static String FILE_ZONA =
	// CONF_FOLDER+"zona.json";//"./CONF/zona.json"
	final static String FILE_ZONA = "../CONF/zona.json";// "./CONF/zona.json"

	public MqttClient mqttClient;

	public Luci() throws JSONException, IOException, MqttException {

		JSONObject config = new JSONObject(Helper.leggiFile(FILE_CONF));// dove mi salvo le strutture dal file? cioè
																		// leggo e poi?
		brokerUrl = config.getString("protocol") + "://" + config.getString("broker") + ":" + config.getInt("port");
		mqttDomain = config.getString("mqttDomain");
		mqttSubdomain = config.getString("mqttSubdomain");
		makeMqttTree();

		topicsSub = new ArrayList<String>();
		topicsSub.add("to/all"); // mandare la mia descrizione json
		topicsSub.add(getMqttTree("rpc/", "luci")); // mandare lo stato attuale

		// inutile aggiungere i topic, perche subbo gia' tutto gpio/#
		config = new JSONObject(Helper.leggiFile(FILE_ZONA));

		topicsSub.add(getMqttTree("from/", "gpio/#"));
		topicsSub.add(getMqttTree("to/", "luci/#"));// {"evento":0,"nome":nome_scenario} per attivare/disattivare uno
		topicsSub.add(getMqttTree("from/", "arduino/AN0"));			// scenario; risposta su from/tree/scenari/attiva con
													// {"nome":nome_scenario}
		// topicsSub.add(getMqttTree("to/","luci/salva"));//per rinominare lo scenario
		// piu recente

		this.mqttClient = new MqttClient(brokerUrl, clientId, new MemoryPersistence());

	}

	private void makeMqttTree() {
		if (mqttTree != null)
			return;
		mqttTree = mqttDomain + "/" + mqttSubdomain + "/";
	}

	public static String getMqttTree(String prefix, String suffix) {
		return (prefix.endsWith("/") ? prefix : prefix + "/") + mqttTree
				+ (suffix.startsWith("/") ? suffix.substring(1) : suffix);
	}

	public static void main(String args[]) throws JSONException, IOException, MqttException {

		System.out.println("started");
		luciList = new ArrayList<Luce>();
		startSystemo();
	}

	private static void startSystemo() throws JSONException, IOException, MqttException {
		System.out.println(Helper.leggiFile(FILE_ZONA));
		JSONObject config = new JSONObject(Helper.leggiFile(FILE_ZONA));
		System.out.println(config);
		String sensM = config.getString("sensM");
		int index = 0;
		while (config.has("lamp" + index)) {
			System.out.println(index + "\n");
			JSONObject k = config.getJSONObject("lamp" + index);
			System.out.println(k);
			String a = k.getString("output");
			String b = k.getString("input");
			boolean c = k.getBoolean("stato");
			String d = k.getString("nome");

			Luce luce = new Luce(a, b, c, d);

			luciList.add(luce);
			System.out.println(config.get("lamp" + index));
			index++;
		}

		Luci luci = new Luci();
		Esecutore esec = Esecutore.istanziatore(luci);
		luci.startClient(esec, sensM);
	}

	public void sendMqttMessage(String topic, String msg) throws MqttException {
		final MqttTopic msgTopic = mqttClient.getTopic(topic);
		msgTopic.publish(new MqttMessage(msg.getBytes()));
	}

	public void startClient(Esecutore esec, String sensM) throws MqttException {
		MqttConnectOptions options = new MqttConnectOptions();
		options.setUserName("gruppo2");
		options.setPassword("funziona".toCharArray());
		options.setCleanSession(false);
		mqttClient.setCallback(new Subscriber(this, esec, sensM));

		mqttClient.connect(options);

		for (String t : topicsSub)
			mqttClient.subscribe(t);
	}

}