/*
 * Licensed Materials - Property of Rogue Wave Software, Inc. 
 * © Copyright Rogue Wave Software, Inc. 2014, 2015 
 * © Copyright IBM Corp. 2009, 2014
 * © Copyright ILOG 1996, 2009
 * All Rights Reserved.
 *
 * Note to U.S. Government Users Restricted Rights:
 * The Software and Documentation were developed at private expense and
 * are "Commercial Items" as that term is defined at 48 CFR 2.101,
 * consisting of "Commercial Computer Software" and
 * "Commercial Computer Software Documentation", as such terms are
 * used in 48 CFR 12.212 or 48 CFR 227.7202-1 through 227.7202-4,
 * as applicable.
 */
package action;

import ilog.tgo.model.IltAlarm;
import ilog.tgo.model.IltObjectState;

import ilog.cpl.model.IlpAttribute;
import ilog.cpl.model.IlpRepresentationObject;

import ilog.views.faces.dhtml.IlvDHTMLConstants;
import ilog.views.faces.dhtml.event.FacesMenuActionEvent;
import ilog.views.faces.dhtml.event.FacesViewActionListener;
import ilog.views.util.servlet.model.IlvMenuItem;

import java.util.EventObject;

/**
 * This is ActionListener that handles the alarms management 
 * of the currently selected object.
 */
public class AlarmStateHandler extends FacesViewActionListener {
  
  private static final String ADD = "add"; 
  private static final String REMOVE = "remove"; 
  private static final String REMOVE_ALL = "remove_all"; 
  
  private static final String MINOR = "minor"; 
  private static final String MAJOR = "major"; 
  private static final String WARNING = "warning";   
  
  /**
   * Id of Add Major alarm menu item. 
   */
  public static final String ADD_MAJOR_ID = ADD + "-" + MAJOR; 
  /**
   * Id of Add Minor alarm menu item. 
   */
  public static final String ADD_MINOR_ID = ADD + "-" + MINOR; 
  /**
   * Id of Add Warning alarm menu item. 
   */
  public static final String ADD_WARNING_ID = ADD + "-" + WARNING; 
  
  /**
   * Id of Remove Major alarm menu item. 
   */
  public static final String REMOVE_MAJOR_ID = REMOVE + "-" + MAJOR; 
  /**
   * Id of Remove Minor alarm menu item. 
   */
  public static final String REMOVE_MINOR_ID = REMOVE + "-" + MINOR; 
  /**
   * Id of Remove Warning alarm menu item. 
   */
  public static final String REMOVE_WARNING_ID = REMOVE + "-" + WARNING; 
  
  /**
   * Id of Remove All alarm menu item. 
   */
  public static final String REMOVE_ALL_ID = REMOVE_ALL; 
    
  /**
   * Constructor. It uses the <code>IMAGE_SERVLET_CONTEXT</code> as no
   * other JSF component has to be updated.
   */
  public AlarmStateHandler() {
    super(IlvDHTMLConstants.JSF_CONTEXT);
  }
  
  /**
   * Adds or removes alarms from the object in the EventObject depending on the 
   * ID (as defined in this class) of the potential IlvMenuItem carried by the 
   * EventObject.
   *
   * @param event The event object.
   */
  public void actionPerformed(EventObject event) throws Exception {
    
    // event is instance of ServletActionEvent
    FacesMenuActionEvent facesActionEvent = (FacesMenuActionEvent)event;
    
    // get active object
    IlpRepresentationObject obj = (IlpRepresentationObject)facesActionEvent.getObject();
    
    // get the menu item 
    IlvMenuItem menuItem = facesActionEvent.getSelectedMenuItem();
    
    String actionId = menuItem.getId();

    if(actionId != null) {
      
      // get object state from 'objectState' attribute
      IlpAttribute attrib = obj.getAttributeGroup().getAttribute("objectState");
      IltObjectState oState = (IltObjectState)obj.getAttributeValue(attrib);
      
      if (null != oState) {
        
        IltAlarm.State alarmState = ((IltAlarm.State)oState.getAlarmState());
        
        //If we need to remove all, then just do it
        if(AlarmStateHandler.REMOVE_ALL_ID.equals(actionId)) {
          alarmState.removeAllAlarms();
          return;
        } else {
          
          IltAlarm.Severity severity = getSeverityForId(actionId);
         
          //Either we add it  
          if(actionId.indexOf(AlarmStateHandler.ADD) != -1){
            alarmState.addNewAlarm(severity);
          } 
          //Or remove it
          else if(actionId.indexOf(AlarmStateHandler.REMOVE) != -1){
            alarmState.removeNewAlarm(severity);
          }
          
          //Nothing else          
        }      
      }
    }
  }  
  
  /**
   * Return the IltAlarm.Severity instance for the provided action ID 
   * as defined in this class.  
   */
  private IltAlarm.Severity getSeverityForId(String id) {
    
    if(id.indexOf(AlarmStateHandler.MAJOR) != -1) {
      return IltAlarm.Severity.Major;
    } else if(id.indexOf(AlarmStateHandler.MINOR) != -1) {
      return IltAlarm.Severity.Minor;
    } else if(id.indexOf(AlarmStateHandler.WARNING) != -1) {
      return IltAlarm.Severity.Warning;
    }    
    return IltAlarm.Severity.Unknown;
  }

}