/*
propertiesFile - zabezpečuje vytvorenie, a manipuláciu nastavených parametrov
svetelných zdrojov, ale aj parametrov meracieho procesu ...
Trieda je zodpovedná za ukladanie, načítanie parametrov, ktoré slúžia,
ako záložný zdroj informácií pre program používateľského rozhrania ...
 */

package CommunicationAndSaving;

import java.io.*;
import java.util.Properties;

public class propertiesFile {

    //private final String PROPERTIES_FILE_NAME = "C:\\Users\\Martin Ivor\\Desktop\\FinalDP\\FinalDPjava\\Properties\\measurementProperties.properties";
    //private final String DEFAULT_FILE_NAME = "C:\\Users\\Martin Ivor\\Desktop\\FinalDP\\FinalDPjava\\Properties\\defaultMeasurementProperties.properties";

    private final String PROPERTIES_FILE_NAME = "Properties\\measurementProperties.properties";
    private final String DEFAULT_FILE_NAME = "Properties\\defaultMeasurementProperties.properties";

    static propertiesFile properties_File = null;

    Properties properties = new Properties();
    Properties defaultProperties = new Properties();
    Properties firstProperties = new Properties();

    /*
    Konštruktor triedy, umožňuje načítanie nastavení v súbore
    "Properties\\measurementProperties.properties
    - súkromný (private) konštruktor, Singleton ...
     */
    private propertiesFile() throws IOException {
        loadProperties();
    }

    /*
    Funkcia, ktorá umožňuje vrátenie inštancie triedy "propertiesFile",
    v prípade, že inštancia existuje, vráti aktuálnu inštanciu ...
    ak žiadna inštancia vytvorená nie je, vytvorí sa nová ..
    týmto sa nastaví to, že v systéme existuje len jedna inštancia
    tejto triedy ...
     */
    public static propertiesFile getInstance() throws IOException {
        if(properties_File == null){
            properties_File = new propertiesFile();
        }
        return properties_File;
    }

    /*
    Funkcia, umožňujúca načítanie nastavení s existujúceho súbora, funkcia
    sa načítava automaticky, pri vytvorení inštancie, tejto triedy.
    V prípade, ak sa množina hodnôt "keySet" v nastaveniach, nezhoduje
    s množinou "keySet" defaultných nastavení, dôjde k načítaniu
    defaultných nastavení, a k ich následnému uloženie, do súbora s
    "hlavnými" nastaveniami ...
     */
    public void loadProperties() throws IOException {
        InputStream inputStream = new FileInputStream(PROPERTIES_FILE_NAME);
        properties.load(inputStream);
        if(inputStream != null){
            inputStream.close();
        }
        if(properties.keySet().containsAll(defaultProperties.keySet())){
            //Žiadúci stav ..
        }else{
            loadDefaultProperties();
            properties.putAll(defaultProperties);
            saveProperties();
        }
    }

    /*
    Funkcia umožňujúca načítanie defaultných nastavení, funkcia sa
    uplatňuje, v niekoľkých prípadoch, konkrétne, v prípade, ak sa
    nepodarí načítať "hlavné" nastavenia alebo v prípade obnovenia
    nastavení ...
    V prípade, že sa nepodarí načítať defaultné nastavenia, tak sa
    nastavia nastavenia, ktoré sú uvedené v hlavnej časti programu
    "goniofotometer" ...
     */
    public void loadDefaultProperties() throws IOException {
        InputStream inputStream = new FileInputStream(DEFAULT_FILE_NAME);
        defaultProperties.load(inputStream);
        if(inputStream != null){
            inputStream.close();
        }

        if(defaultProperties.keySet().containsAll(firstProperties.keySet())){
            //Žiadúci stav ..
        }else{
            defaultProperties.putAll(firstProperties);
            saveDefaultProperties();
        }
    }

    /*
    Funkcie "saveProperties()" a "saveDefaultProperties()", umožňujú ukladanie
    parametrov (nastavení), do špeciálnych textových súborov ...
     */
    public void saveProperties() throws IOException {
        OutputStream outputStream = new FileOutputStream(PROPERTIES_FILE_NAME);
        properties.store(outputStream, null);
        if(outputStream != null){
            outputStream.close();
        }
    }

    public void saveDefaultProperties() throws IOException {
        OutputStream outputStream = new FileOutputStream(DEFAULT_FILE_NAME);
        defaultProperties.store(outputStream, null);
        if(outputStream != null){
            outputStream.close();
        }
    }

    /*
    Funkcie "set_Property()" a "get_Property()", umožňujú získať,
    a nastaviť hodnotu konkrétneho parametra ...
     */
    public void set_Property(String key, String value) throws IOException {
        properties.setProperty(key, value);
        saveProperties();
    }

    public String get_Property(String key) throws IOException {
        String value = properties.getProperty(key);
        return value;
    }

    /*
    Funkcia umožňujúca nastavenie nastavení na hodnotu
    defaultných nastavení ... uložených v defaultnom
    súbore s nastaveniami ...
     */
    public void undoProperties() throws IOException {
        loadDefaultProperties();
        properties.putAll(defaultProperties);
        saveProperties();
    }

    /*
    Funkcia použitá v hlavnej triede "goniofotometer" na
    uloženie základných parametrov, v prípade prázdneho
    súboru s nastaveniami, a defaultnými nastaveniami ...
     */
    public void setAllByUserProperties(Properties properties) throws IOException {
        firstProperties.putAll(properties);
        loadDefaultProperties();
    }
}
