import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import jerklib.IRCConnectionManager;
import jerklib.events.IRCEvent;
import jerklib.events.JoinCompleteIRCEvent;
import jerklib.events.MOTDIRCEvent;
import jerklib.events.NoticeIRCEvent;
import jerklib.events.PrivMsgIRCEvent;
import jerklib.events.listeners.IRCEventListener;

public class JerkLibExample implements IRCEventListener
{
  private Map  stratMap;

  public JerkLibExample()
  {
    /* create strategies */
    initStratMap();
    
    /* create manager object with default nick */
    IRCConnectionManager manager = new IRCConnectionManager("horrible");
    
    /* add IRCListener to be notifed of all events */
    manager.addIRCEventListener(this);
    
    /* manager loops until told other wise so put on a thread */
    new Thread(manager).start();
    
    /* request connection */
    manager.requestConnection("irc.community.tummy.com");
    
  }

  public void recieveEvent(IRCEvent e)
  {
    IRCRunnable runnable = stratMap.get(e.getType());
    if(runnable != null)
    {
      runnable.run(e);
    }
    else
    {
      System.out.println("No Handler for " + e.getType());
    }
    
  }
  
  
  private void initStratMap()
  {
    stratMap = new HashMap();
    
    stratMap.put(IRCEvent.Type.MOTD , new IRCRunnable()
        {
          public void run(IRCEvent e)
          {
            MOTDIRCEvent me = (MOTDIRCEvent)e;
            System.out.println("MOTD:" + me.getHost() +"-" + me.getMOTDLine());
          }
        });
    
    
    stratMap.put(IRCEvent.Type.READY_TO_JOIN , new IRCRunnable()
        {
          public void run(IRCEvent e)
          {
            try
            {
              e.getConnection().join("#test");
              
            } catch (IOException e1)
            {
              e1.printStackTrace();
            }
          }
        });
    
    stratMap.put(IRCEvent.Type.JOIN_COMPLETE , new IRCRunnable()
        {
          public void run(IRCEvent e)
          {
            JoinCompleteIRCEvent je = (JoinCompleteIRCEvent)e;
            je.getChannel().channelSay("HALLO WORLD!!");
          }
        });
    
    stratMap.put(IRCEvent.Type.PRIVMSG , new IRCRunnable()
        {
          public void run(IRCEvent e)
          {
            PrivMsgIRCEvent pme = (PrivMsgIRCEvent)e;
            System.out.println(pme.getHost() + " " + pme.getNick() + ":" + pme.getMessage());
          }
        });
    
    stratMap.put(IRCEvent.Type.NOTICE , new IRCRunnable()
        {
          public void run(IRCEvent e)
          {
            NoticeIRCEvent ne = (NoticeIRCEvent)e;
            System.out.println("NOTICE - " + ne.getHost() + ":" + ne.getNoticeMessage());
          }
        });
    
    stratMap.put(IRCEvent.Type.DEFAULT , new IRCRunnable()
        {
          public void run(IRCEvent e)
          {
            System.out.println(e.getRawEventData());
          }
        });
  }
  
  
  private interface IRCRunnable
  {
    public void run(IRCEvent e);
  }
  
  
  public static void main(String[] args)
  {
    new JerkLibExample();
  }
  
}