package de.reinhardt_karlheinz.pcc.interfaces;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;

import de.reinhardt_karlheinz.pcc.listeners.PCCMsgListener;
import de.reinhardt_karlheinz.pcc.listeners.PCConnectionListener;
import de.reinhardt_karlheinz.pcc.plugins.PluginInterface;

public abstract class PluginLoader {
  private PCCConnection server;

  private PluginInterface plgItfc;

  private ArrayList<PCCPlugin> plugins = new ArrayList<PCCPlugin>();

  public PluginLoader(PCCConnection server) {
    this.server = server;
    plgItfc = new PluginInterface(server, this);
  }

  public abstract void loadPlugins() throws FileNotFoundException, IOException,
      ClassNotFoundException, InstantiationException, IllegalAccessException;

  // ##### GENERAL STUFF (LOAD/START/STOP) ######
  public void startAllPlugins() {
    for (PCCPlugin p : plugins) {
      plgItfc.startPlugin(p);
    }
  }

  public void closeAllPlugins() {
    for (PCCPlugin p : plugins) {
      removePlugin(p);
      plgItfc.closePlugin(p);
    }
  }

  public void startPlugin(PCCPlugin pluginToStart) {
    for (PCCPlugin p : plugins) {
      if (p.equals(pluginToStart)) {
        plgItfc.startPlugin(p);
      }
    }
  }

  public void closePlugin(PCCPlugin pluginToClose) {
    for (PCCPlugin p : plugins) {
      if (p.equals(pluginToClose)) {
        removePlugin(p);
        plgItfc.closePlugin(p);
      }
    }
  }

  public void addPlugin(PCCPlugin p) {
    plugins.add(p);
  }

  protected void removePlugin(PCCPlugin p) {
    plugins.remove(p);
  }

  // #############################
  // ##### getter and setter #####
  // #############################

  public void printLoadedPluginInfos() {
    System.out.println("######## LOADED PLUGINS ########");
    for (PCCPlugin plugin : plugins) {
      System.out.println(plugin.getName() + " : v." + plugin.getVersion());
    }
    System.out.println("################################");
  }

  public ArrayList<PCCPlugin> getLoadedPlugins() {
    return plugins;
  }

  protected void setLoadedPlugins(ArrayList<PCCPlugin> p) {
    plugins = p;
  }

  /**
   * @return the server
   */
  public PCCConnection getServer() {
    return server;
  }

  /**
   * @param server
   *          the server to set
   */
  public void setServer(PCCConnection server) {
    this.server = server;
  }
}
