package device;

import de.fh_zwickau.informatik.sensor.IZWayApi;
import de.fh_zwickau.informatik.sensor.ZWayApiHttp;
import de.fh_zwickau.informatik.sensor.model.devices.Device;
import de.fh_zwickau.informatik.sensor.model.devices.DeviceList;
import support.ZWaySimpleCallback;

// TODO da mettere a posto secondo me, dato che da un po di problemi IRL
/**
 * Sensore che permette di registrare vari dati dell'ambiente
 */
public class Sensor {

    /**
     * IP del sensore a cui ci si vuole agganciare
     */
    private static final String IP_ADDRESS = "172.30.1.137";

    /**
     * Porta in cui si ascolta per i sensori
     */
    private static final int PORT = 8083;

    /**
     * Username con cui si entra nel dispositivo
     */
    private static final String USERNAME = "admin";
    /**
     * Password del dispositivo
     */
    private final String PASSWORD = "raz4reti2";

    /**
     * Tutti i devices che esistono nella rete
     */
    private DeviceList allZWaveDevices;
    /**
     * I device che vengono selezionati e filtrati dall'utente (ovvero quelli che verranno usati per prendere i dati)
     */
    private DeviceList devices;

    /**
     * Crea un sensore contenente tutti i nodi
     * @throws NullPointerException se non trova nessun sensore
     */
    public Sensor() throws NullPointerException { this(null); }

    /**
     * Si connette ad un sensore che ha il nodeId selezioniato
     * @param nodeId nodo che viene selezionato
     * @throws NullPointerException se non trova nessun sensore
     */
    public Sensor (Integer nodeId) throws NullPointerException {
        // create an instance of the Z-Way library; all the params are mandatory (we are not going to use the remote service/id)
        IZWayApi zwayApi = new ZWayApiHttp(IP_ADDRESS, PORT, "http", USERNAME, PASSWORD, 0, false, new ZWaySimpleCallback());

        // get all the Z-Wave devices
        allZWaveDevices = zwayApi.getDevices();

        if(allZWaveDevices == null)
            throw new NullPointerException("I sensori non sono stati trovati");

        if(nodeId != null)
            useNode(nodeId);
        else
            devices = allZWaveDevices;
    }

    /**
     * Cambia i dispositivi selezionati in base al nodeId che viene scelto
     * @param nodeId il nodo che viene selezionato
     */
    public void useNode(int nodeId) {
        devices = new DeviceList();
        for (Device devi : allZWaveDevices.getAllDevices())
            if(devi.getNodeId() == nodeId)
                devices.addDevice(devi);
    }

    /**
     * Legge i valori della luminosita' segnata dai dispositivi e ne ritorna il valore
     * @return la luminosita' segnata dai dispositivi (da 0 a 100)
     */
    public double getBrightnessLevel() {
        update();
        for (Device device : devices.getAllDevices())
            if (device.getMetrics().getProbeTitle().equalsIgnoreCase("luminiscence"))
                return Double.parseDouble(device.getMetrics().getLevel())/10;
        return 0;
    }

    /**
     * Fa in modo di forzare l'aggiornamento dei dispositivi
     */
    synchronized private void update() {
        for (Device device : devices.getAllDevices())
            try {
                device.update();
            } catch (Exception e) { }
    }
    /*
    public boolean IsLowLuminescence(int Luminescence) {
                if (dev.getProbeType().equalsIgnoreCase("Luminescence"))
                    if (Integer.parseInt(dev.getMetrics().getLevel()) < Luminescence)
                        return true;
                    else
                        return false;
                    return false;
    }*/
}
