package hero.hook;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;

import hero.interfaces.BnNodeLocal;
import hero.interfaces.Constants;
import hero.interfaces.ProjectSessionLocal;
import hero.interfaces.ProjectSessionLocalHome;
import hero.interfaces.ProjectSessionUtil;
import hero.util.HeroHookException;

public class SwitchHook implements NodeHookI {
  
  /** Name of the Property that contains the publication date */
  public static final String DATE_PROPERTY_NAME = "startDate";
  public static final String WAIT_ACTIVITY_NAME = "wait";
   
  public String getMetadata() {

    // Return Metadata information
    return Constants.Nd.BEFORETERMINATE;
  }

  public void beforeStart(Object arg0, BnNodeLocal arg1)
      throws HeroHookException {
  }
  public void afterStart(Object obj, BnNodeLocal node)
      throws HeroHookException {
  }

  public void beforeTerminate(Object obj, BnNodeLocal node)
      throws HeroHookException {
    
    ProjectSessionLocal projectSession = null;
    
    try {
      // Initialize Project Session
      String projectName = node.getBnProject().getName();
      ProjectSessionLocalHome projectSessionHome = ProjectSessionUtil.getLocalHome();
      projectSession = projectSessionHome.create();
      projectSession.initProject(projectName);

      // Determine the amount of time to wait
      long relativeDeadline = Long.parseLong(projectSession.getNodeProperty("SetDeadline",SwitchHook.DATE_PROPERTY_NAME).getTheValue());      
        
        // Modifiy the Deadline of the Wait Activity
        Collection<Long> deadlines = new ArrayList<Long>();
        deadlines.add(relativeDeadline);
        projectSession.setNodeRelativeDeadlines(WAIT_ACTIVITY_NAME, deadlines);        
     }
    catch(Exception e) {
      // TODO Use logging system instead
      e.printStackTrace();
    }
    finally {
      try {
        projectSession.remove();
      }
      catch(Exception ignore) {
      }
    }
  }

  public void afterTerminate(Object arg0, BnNodeLocal arg1)
      throws HeroHookException {
  }

  public void anticipate(Object arg0, BnNodeLocal arg1)
      throws HeroHookException {
  }

  public void onCancel(Object arg0, BnNodeLocal arg1) throws HeroHookException {
  }

  public void onDeadline(Object arg0, BnNodeLocal arg1)
      throws HeroHookException {
  }

  public void onReady(Object arg0, BnNodeLocal arg1) throws HeroHookException {
  }
}
