package de.reinhardt_karlheinz.pcc.plugins;

import de.reinhardt_karlheinz.pcc.events.PCCMessageEvent;
import de.reinhardt_karlheinz.pcc.events.PCConnectionEvent;
import de.reinhardt_karlheinz.pcc.interfaces.PCCConnection;
import de.reinhardt_karlheinz.pcc.interfaces.PCCPlugin;
import de.reinhardt_karlheinz.pcc.interfaces.PCCPluginInterface;
import de.reinhardt_karlheinz.pcc.interfaces.PluginLoader;
import de.reinhardt_karlheinz.pcc.listeners.PCCMsgListener;
import de.reinhardt_karlheinz.pcc.listeners.PCConnectionListener;

/**
 * 
 * (c) Copyright 2012, Karlheinz Reinhardt. All rights reserved.
 * 
 * @author Karlheinz Reinhardt
 * @version TODO
 * 
 */
public class PluginInterface implements PCCPluginInterface,
    PCConnectionListener, PCCMsgListener {
  private PCCConnection svr;

  private PluginLoader plgLdr;

  public PluginInterface(PCCConnection server, PluginLoader plgLdr) {
    svr = server;
    this.plgLdr = plgLdr;
    svr.addPCConnectionListener(this);
    svr.addPCCMsgListener(this);
  }

  @Override
  public synchronized void sendMsg(String msg) {
    svr.sendMsg(msg);
  }

  @Override
  public synchronized void sendCmd(String cmd) {
    svr.sendCmd(cmd);
  }

  public void closePlugin(PCCPlugin p) {
    p.onPluginClose();
  }

  public void startPlugin(PCCPlugin p) {
    p.onPluginStart(this);
  }

  // ####################
  // ##### listener #####
  // ####################
  @Override
  public void onMsgReceived(PCCMessageEvent e) {
    System.out.println("PCCPluginManager: msg: " + e.getMessage());
    for (PCCPlugin p : plgLdr.getLoadedPlugins()) {
      p.onMessageReceived(e.getMessage());
    }
  }

  @Override
  public void onCommandReceived(PCCMessageEvent e) {
    System.out.println("PCCPluginManager: cmd: " + e.getMessage());
    for (PCCPlugin p : plgLdr.getLoadedPlugins()) {
      p.onCommandReceived(e.getMessage());
    }
  }

  @Override
  public void onPCConnectionEstablished(PCConnectionEvent e) {
    System.out.println("PCCPluginManager: Connection established");
    for (PCCPlugin p : plgLdr.getLoadedPlugins()) {
      p.onConnectionEstablished();
    }
  }

  @Override
  public void onPCConnectionLost(PCConnectionEvent e) {
    System.out.println("PCCPluginManager: Connection lost");
    plgLdr.closeAllPlugins();
  }

  // ####################
}
