package de.reinhardt_karlheinz.pcc.pc.plugins;

import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;

import de.reinhardt_karlheinz.pcc.interfaces.PCCConnection;
import de.reinhardt_karlheinz.pcc.interfaces.PCCPlugin;
import de.reinhardt_karlheinz.pcc.interfaces.PluginLoader;

//public class PCCPluginLoader implements PCConnectionListener, PCCMsgListener {
public class PC_PluginManager extends PluginLoader {

  public PC_PluginManager(PCCConnection server) {
    super(server);
  }

  @Override
  public void loadPlugins() throws FileNotFoundException, IOException,
      ClassNotFoundException, InstantiationException, IllegalAccessException {
    setLoadedPlugins(new ArrayList<PCCPlugin>());
    System.out.println("loading plugins");
    // get all jar-files located in the ./plugins folder
    File[] jarFiles = new File("./plugins").listFiles(new FileFilter() {
      @Override
      public boolean accept(File f) {
        return f.getName().toLowerCase().endsWith(".jar");
      }
    });

    System.out.println("fetching plugin urls");// TODO
    // get a URL of each .jar file
    URL[] urls = new URL[jarFiles.length];
    for (int i = 0; i < jarFiles.length; i++) {
      urls[i] = jarFiles[i].toURI().toURL();
    }
    // load all classes located in the .jars
    ClassLoader loader = new URLClassLoader(urls);

    // check each jar file if it contains a plugin
    System.out.println("fetching plugin interfaces");// TODO
    for (File jarFile : jarFiles) {
      JarInputStream jaris = new JarInputStream(new FileInputStream(jarFile));
      JarEntry entry;
      while ((entry = jaris.getNextJarEntry()) != null) {
        // get class
        if (entry.getName().toLowerCase().endsWith(".class")) {
          String className = entry.getName()
              .substring(0, entry.getName().length() - 6).replace('/', '.');
          // load class
          Class<?> cls = loader.loadClass(className);
          // for all interfaces
          for (Class<?> i : cls.getInterfaces()) {
            // add if is a plugin
            if (i.equals(PCCPlugin.class)) {
              System.out.println("load plugin interface");//TODO
              getLoadedPlugins().add((PCCPlugin) cls.newInstance());
              break;
            }
          }
        }
      }
    }
    System.out.println("Plugins loaded");
    printLoadedPluginInfos();

  }

}
