/*
 * 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 monitoring.web.utils;

import ilog.cpl.model.IlpObject;
import ilog.tgo.model.IltAlarm;
import ilog.tgo.model.IltAlarmSeverity;
import ilog.tgo.model.IltObject;

/**
 * This class provides client-side styling for a given object in a table.
 * <p>
 * The mapped properties are:
 * <ol>
 * <li>Icon URI
 * <li>Alarm color
 * <li>Alarm name
 * </ol>
 */
public class AlarmStylingUtils {
  
  // Icon URIs
  private static final String BASE_PATH = "/resources/images";
  private static final String ALARM_PATH = BASE_PATH + "/alarms";
  private static final String UNKNOWN_ICON = ALARM_PATH + "/unknown.gif";
  private static final String CLEARED_ICON = ALARM_PATH + "/cleared.gif";
  private static final String CRITICAL_ICON = ALARM_PATH + "/critical.gif";
  private static final String MAJOR_ICON = ALARM_PATH + "/major.gif";
  private static final String MINOR_ICON = ALARM_PATH + "/minor.gif";
  private static final String WARNING_ICON = ALARM_PATH + "/warning.gif";

  private static final String ACKNOWLEDGE_ICON = ALARM_PATH + "/acknowledge-alarm-icon.gif";
  private static final String UNACKNOWLEDGE_ICON = ALARM_PATH + "/unacknowledge-alarm-icon.gif";

  // Background color
  private static final String BACKGROUND_SELECTOR = "font-size: 12px; font-weight: bold; color:";
  private static final String UNKNOWN_COLOR = BACKGROUND_SELECTOR + "rgb(150,150,150);";
  private static final String CLEARED_COLOR = BACKGROUND_SELECTOR + "rgb(255,255,255);";
  private static final String CRITICAL_COLOR = BACKGROUND_SELECTOR + "rgb(255,0,0);";
  private static final String MAJOR_COLOR = BACKGROUND_SELECTOR + "rgb(255,0,0);";
  private static final String MINOR_COLOR = BACKGROUND_SELECTOR + "rgb(255,160,0);";
  private static final String WARNING_COLOR = BACKGROUND_SELECTOR + "rgb(245,215,40);";

  /**
   * Returns the URI to the image to be used as representation of
   * a given alarm object.
   */
  public static String getIconURI(IlpObject cell) {
    if (cell instanceof IltAlarm) {
      IltAlarmSeverity sev = ((IltAlarm) cell).getPerceivedSeverity();
      if (IltAlarm.Severity.Cleared.equals(sev)) {
        return CLEARED_ICON;
      } else if (IltAlarm.Severity.Critical.equals(sev)) {
        return CRITICAL_ICON;
      } else if (IltAlarm.Severity.Major.equals(sev)) {
        return MAJOR_ICON;
      } else if (IltAlarm.Severity.Minor.equals(sev)) {
        return MINOR_ICON;
      } else if (IltAlarm.Severity.Warning.equals(sev)) {
        return WARNING_ICON;
      }
    }
    return UNKNOWN_ICON;
  }

  /**
   * Returns the URI to the image representing an acknowledge alarm
   */
  public static String getAckIconURI(IlpObject cell) {
    if (cell instanceof IltAlarm) {
      return (((IltAlarm) cell).getAlarmAckState()
          ? ACKNOWLEDGE_ICON
              : UNACKNOWLEDGE_ICON);
    }
    return UNACKNOWLEDGE_ICON;
  }

  /**
   * Returns the severity HTML CSS styling color (background-color) 
   * for the given alarm object.
   */
  public static String getAlarmColor(IlpObject cell) {
    if (cell instanceof IltAlarm) {
      return getAlarmColorFromSeverity(((IltAlarm) cell)
          .getPerceivedSeverity());
    } else if (cell instanceof IltObject) {
      Object st = ((IltObject) cell).getAlarmState();
      if (null == st) {
        return UNKNOWN_COLOR;
      } else {
        return getAlarmColorFromSeverity(((IltObject) cell)
            .getAlarmState().getHighestAlarmSeverity());
      }
    }
    return UNKNOWN_COLOR;
  }

  /**
   * Returns the severity name for the given alarm object.
   */
  public static String getAlarmName(IlpObject cell) {
    if (cell instanceof IltAlarm) {
      return ((IltAlarm) cell).getPerceivedSeverity().getName();
    }
    return IltAlarm.Severity.Unknown.getName();
  }
  
  /**
   * Returns the alarm color that should be used for the provided severity.
   */
  private static String getAlarmColorFromSeverity(IltAlarmSeverity sev) {
    if (IltAlarm.Severity.Cleared.equals(sev)) {
      return CLEARED_COLOR;
    } else if (IltAlarm.Severity.Critical.equals(sev)) {
      return CRITICAL_COLOR;
    } else if (IltAlarm.Severity.Major.equals(sev)) {
      return MAJOR_COLOR;
    } else if (IltAlarm.Severity.Minor.equals(sev)) {
      return MINOR_COLOR;
    } else if (IltAlarm.Severity.Warning.equals(sev)) {
      return WARNING_COLOR;
    }
    return UNKNOWN_COLOR;
  }
}