package hu.elte.inf.pszt.prt.javalib.swingapp;

import java.io.File;
import java.io.FileFilter;
import javax.swing.SwingUtilities;

/**
 *
 * @author lengyel zsolt
 */
public class ElteSwingApp implements Runnable {

    public static void main(String[] args) {
        String[] classPath = System.getProperty("java.class.path").split(System.getProperty("path.separator"));
        for (String dir : classPath) {
            loadClassesInDirectory(new File(dir), "");
        }
        if (window == null) {
            System.err.println("No ElteJFrame is found. Please inherit a class from ElteJFrame");
        } else {
            startAppWithWindow();
        }
    }
    private static ElteJFramable window = null;

    public static void setWindow(ElteJFramable window) {
        ElteSwingApp.window = window;
    }

    private static void startAppWithWindow() {
        SwingUtilities.invokeLater(new ElteSwingApp());
    }

    private static void loadClassesInDirectory(File directory, String packageName) {
        File[] classFiles = directory.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return pathname.isDirectory() || pathname.getName().endsWith(".class");
            }
        });
        if (classFiles == null) {
            return;
        }
        for (File classFile : classFiles) {
            final String className = classFile.getName();
            if (classFile.isDirectory() && !(className.equals("org") || className.equals("com"))) {
                loadClassesInDirectory(classFile, packageName.concat(className + "."));
            } else {
                try {
                    String classFullName = packageName.concat(className.substring(0, className.length() - 6));
                    Class<?> classs = ClassLoader.getSystemClassLoader().loadClass(classFullName);
                    if (classs.getSuperclass() != null && classs.getSuperclass().equals(ElteJFrame.class)) {
                        try {
                            window = (ElteJFramable) classs.newInstance();
                            return;
                        } catch (InstantiationException | IllegalAccessException ex) {
                            System.err.println(ex.getMessage());
                        }
                    }
                } catch (ClassNotFoundException ex) {
                    System.err.println(ex.getMessage());
                }
            }
        }
    }

    @Override
    public void run() {
        window.onCreate();
        window.registerWindowAdapter();
        window.onConfigLoad();
        window.onShow();
    }
}
