/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package propertyhandler;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Locale;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * A fájlok helyét meghatározó osztály
 * @author Esta
 */
public class FileLocations {

    /**
     * Visszatér a beállításokat tartalmazó mappa nevével.
     * @return a settings mappa neve
     */
    public static String getSettingsDir() {
        if (FileLocations.isWindows()) {
            return System.getenv("APPDATA") + File.separator + "XMLCalculator" + File.separator;
        } else if (FileLocations.isLinux()) {
            return "" + System.getenv("HOME") + "/.XMLCalculator/";
        } else {
            return "";
        }
    }

    /**
     * Az alapértelmezett xsd fájl helyét adja meg.
     * @return a default.xsd fájl helye
     */
    public static String getDefaultXSD() {
        return FileLocations.getSettingsDir() + "default.xsd";
    }

    public static void setChoosenLocale(Locale l) throws IOException {
        File langfile = new File(FileLocations.getLanguageFile());
        if (!langfile.exists()) {
            try {
                langfile.createNewFile();
            } catch (IOException iOException) {
                throw new IOException("CANT_SET_LOCALE");
            }
        }
        if (!langfile.canWrite()) {
                throw new IOException("CANT_WRITE_LOCALEFILE");
        }
        try {
            PrintWriter pw = new PrintWriter(langfile);
            pw.println(l.getLanguage());
            pw.close();
        } catch (FileNotFoundException ex) {
            Logger.getLogger(FileLocations.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public static Locale getChoosenLocale() {
        Locale current=null;
        File langfile = new File(FileLocations.getLanguageFile());
        if (!langfile.exists() || !langfile.canRead()) {
            current = new Locale("en");
        } else {
            try {
                Scanner sc = new Scanner(langfile);
                while (sc.hasNextLine()) {
                    String locstr = sc.nextLine();
                    current = new Locale(locstr);
                }
                if (current==null || current.getLanguage().equals("")) {
                    current = new Locale("en");
                }
            } catch (FileNotFoundException ex) {
                Logger.getLogger(FileLocations.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return current;
    }

    /**
     * A nyelvi beállításokat adja meg.
     * @return a langsettings.conf helye.
     */
    public static String getLanguageFile() {
        return FileLocations.getSettingsDir() + "langsettings.conf";
    }

    /**
     * Az alapértelmezett ideiglenes xsd fájl helyét adja meg.
     * @throws FileNotFoundException ha a default.xsd nem található.
     * @throws IOException ha a temp xsd nem hozható létre valamiért.
     * @return a default.xsd fájl helye
     */
    public static String getDefaultTempXSD() throws FileNotFoundException, IOException {
        File out = new File(FileLocations.getTempDir() + "default.xsd");
        if (FileLocations.isWindows() && !out.exists()) {
            Scanner scanner = null;
            PrintWriter printwriter = null;
            try {
                out.createNewFile();
                scanner = new Scanner(new File(FileLocations.getDefaultXSD()));
                printwriter = new PrintWriter(out);
                while (scanner.hasNextLine()) {
                    printwriter.println(scanner.nextLine());
                }
            } catch (FileNotFoundException fileNotFoundException) {
                throw new FileNotFoundException("XSD_NOT_FOUND");
            } catch (IOException ex) {
                throw new IOException("CANT_CREATE_XSD");
            } finally {
                scanner.close();
                printwriter.close();
            }
        }
        return FileLocations.getTempDir() + "default.xsd";
    }

    /**
     * Az ideiglenes könyvtár helyét adja meg.
     * @return az ideiglenes könyvtár helye
     */
    private static String getTempDir() {
        if (FileLocations.isWindows()) {
            if (System.getenv("TEMP").contains(" ") || System.getenv("TEMP").contains("~")) {
                if (new File(System.getenv("WINDIR") + File.separator + "Temp" + File.separator).exists() && new File(System.getenv("WINDIR") + File.separator + "temp" + File.separator).canWrite() && !System.getenv("WINDIR").contains(" ") && !System.getenv("WINDIR").contains("~")) {
                    return System.getenv("WINDIR") + File.separator + "Temp" + File.separator;
                } else {
                    return System.getenv("SYSTEMDRIVE") + File.separator;
                }
            } else {
                return System.getenv("TEMP") + File.separator;
            }
        } else if (FileLocations.isLinux()) {
            return "" + System.getenv("HOME") + "/.XMLCalculator/Temp/";
        } else {
            return "";
        }
    }

    /**
     * Az alapértelmezett ideiglenes fájl helyét adja meg.
     * @return a temp.dat fájl helye
     */
    public static String getDefaultTempData() {
        return FileLocations.getTempDir() + "temp.dat";
    }

    /**
     * Az alapértelmezett ideiglenes XML fájl helyét adja meg.
     * @return a default.xml fájl helye
     */
    public static String getDefaultTempXML() {
        return FileLocations.getTempDir() + "default.xml";
    }

    /**
     * Az alapértelmezett ideiglenes XML fájl helyét adja meg.
     * @return a default.xml fájl helye
     */
    public static String getSecondaryTempXML() {
        return FileLocations.getTempDir() + "secondary.xml";
    }

    /**
     * Az alapértelmezett XSL fájl helyét adja meg, amely számokhoz használható.
     * @return a number.xsl fájl helye
     */
    public static String getDefaultNumberXSL() {
        return FileLocations.getSettingsDir() + "number.xsl";
    }

    /**
     * Az alapértelmezett XSL fájl helyét adja meg, amely mátrixokhoz használható.
     * @return a matrix.xsl fájl helye
     */
    public static String getDefaultMatrixXSL() {
        return FileLocations.getSettingsDir() + "matrix.xsl";
    }

    /**
     * Olyan metódus, ami megállapítja, hogy windowst használunk-e a program futtatásához.
     * @return igen, ha windowst használunk.
     */
    public static boolean isWindows() {
        return System.getProperty("os.name").toLowerCase().startsWith("windows");
    }

    /**
     * Olyan metódus, ami megállapítja, hogy linuxot használunk-e a program futtatásához.
     * @return igen, ha linuxot használunk.
     */
    public static boolean isLinux() {
        return System.getProperty("os.name").toLowerCase().startsWith("linux");
    }
}
