package jnet.lib;

import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import org.apache.commons.configuration2.PropertiesConfiguration;
import org.apache.commons.configuration2.ex.ConfigurationException;

public class PropertiesManager {

    private PropertiesConfiguration config;
    private String file;

    // Konstruktor pro inicializaci s cestou k souboru
    public PropertiesManager(String file) {
        this.file = file;
        this.config = new PropertiesConfiguration();
    }

    public void load() throws FileException, ConfigException {
        try (InputStream input = getClass().getClassLoader().getResourceAsStream(file)) {
            if (input == null) {
                throw new FileException("Soubor config.properties nebyl nalezen.");
            }
            config.read(new InputStreamReader(input, StandardCharsets.UTF_8));
        } catch (ConfigurationException ex) {
            throw new ConfigException("Chyba konfigurace");
        } catch (IOException ex) {
            throw new FileException("Chybný soubor");
        }
    }

    // Metoda pro čtení hodnoty podle klíče
    private String getProperty(String key) {
        return config.getString(key, null); // Vrací null pokud klíč neexistuje
    }

    // Metoda pro nastavení hodnoty podle klíče
    private void setProperty(String key, String value) {
        config.setProperty(key, value);
    }

    // Metoda pro uložení konfigurace do souboru
    public void save() {
        try (FileWriter writer = new FileWriter(file)) {
            // Použití FileWriter pro zápis do souboru
            config.write(writer);
            LogFile.printInfo("Konfigurace byla uspesne ulozena.");
        } catch (IOException | ConfigurationException e) {
            LogFile.printErr("Chyba pri ukladani konfigurace. " + e.getMessage());
        }
    }

    // Metoda pro výpis všech klíčů a hodnot v konfiguraci
//    public void printAllProperties() {
//        Iterator<String> keys = config.getKeys();
//        while (keys.hasNext()) {
//            String key = keys.next();
//            System.out.println(key + " = " + config.getString(key));
//        }
//    }
    public boolean getBoolean(String key) {
        return Boolean.valueOf(getProperty(key));
    }

    public String getString(String key) {
        return getProperty(key);
    }

    public int getInt(String key) {
        return Integer.parseInt(getProperty(key));
    }

    public void setBoolean(String key, Boolean value) {
        setProperty(key, value.toString());
    }

    public void setInt(String key, int value) {
        setProperty(key, String.valueOf(value));
    }

    public void setString(String key, String value) {
        setProperty(key, value);
    }

    public class FileException extends Exception {

        public FileException(String message) {
            super(message);
        }
    }

    public class ConfigException extends Exception {

        public ConfigException(String message) {
            super(message);
        }
    }

}
