import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

/**
 * La classe principale du logiciel AppThinker.
 * @author V.BOULANGER
 */
public class AppThinker {
    //JavaDoc tags : @param @return @throws @author @version @see @since @serial @deprecated

    public static String version = "1.0.0-dev5";
    public static String dateVersion = "18/12/2020";
    public static List<String> changelog;
    public static String developer = "V. BOULANGER";
    public static Properties appProperties = new Properties();

    private static AppThinkerWindow _window;

    /**
     * La méthode principale exécutée.
     * @param args Les arguments de la méthode principale.
     * @throws InterruptedException Interruption du thread lors de la pause du splashscreen.
     */
    public static void main(String[] args) throws InterruptedException {
        //Création de la liste des modifications de la version actuelle
        changelog = new ArrayList<String>();
        changelog.add("Fenêtre A propos et fenêtre de changelog");
        changelog.add("2ème note de version");

        AppThinkerSplashscreen splash = new AppThinkerSplashscreen();
        //Récupération des paramètres du logiciel
        loadConfiguration();
        Thread.sleep(3000);
        splash.dispose();

        _window = new AppThinkerWindow();
        //Si le logiciel s'ouvre pour la 1ère fois, on affiche la fenêtre de changelog
        if(appProperties.getProperty("isFirstLaunch").equals("true")) {
            appProperties.setProperty("isFirstLaunch", "false");
            storeConfiguration();
            ChangelogWindow changelog = new ChangelogWindow();
        }
    }

    /**
     * Récupère la fenêtre de l'application
     * @return La fenêtre de l'application.
     */
    public static AppThinkerWindow getWindow(){
        return _window;
    }

    public static void loadConfiguration(){
        InputStream input = null;
        try {
            input = new FileInputStream("app.properties");
            //Chargement des préférences du logiciel
            appProperties.load(input);
        } catch (final IOException ex) {
            ex.printStackTrace();
        } finally {
            if (input != null) {
                try {
                    input.close();
                } catch (final IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void storeConfiguration(){
        OutputStream output = null;
        try {
            output = new FileOutputStream("app.properties");
            //Enregistrement des propriétés du logiciel
            appProperties.store(output, null);

        } catch (final IOException io) {
            io.printStackTrace();
        } finally {
            if (output != null) {
                try {
                    output.close();
                } catch (final IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
