<?php
# ------------------------------------------------------------
# Dateiname:        $Source: AlarmRecording $
# Version:          $Revision: 0.1 $
# Datum geaendert:  $Date: 2011/01/30 15:00:00 $
# Autor:            $Author: frido $
#   ---------------------------------------------------------

// imports
require_once 'AlarmManagement/DataTypes/HostAddr.php';
require_once 'AlarmManagement/DataTypes/InstAddr.php';
require_once 'AlarmManagement/DataTypes/AlarmStatus.php';
require_once 'AlarmManagement/DataTypes/ServInfl.php';

class AlarmRecording {
    /*
     * recordAlarm:
     *    creates a new CAC instance for a new alarm
     * return value:
     *    EC_OK: CAC created
     *    EC_DUPL_INST: CAC already existing
     */
	
    static function recordAlarm(
        InstAddr $inst_addr,
        $amh_id,
        $evt_time,
        $aed_id,
        AlarmStatus $alm_stat,
        ServInfl $serv_infl,
        &$thr_alm_clr) /* threshold alarm clearance - implicite by decrease of thresholds */
    {
        $amo = AlarmingManagedObjectQuery::create()->findOneByInstAddrVal($inst_addr->getValue());
        
        if ($amo == NULL) {
            $amo = new AlarmingManagedObject();
            
            $amo->setName($inst_addr);
            $amo->setInstAddr($inst_addr);
            $amo->setAmhId($amh_id);
            
            $amo->save();
        }
        
        $cac_lst = CurrentAlarmConditionQuery::create()->findByAmoId($amo->getId());
        
        /* threshold alarm pre-processing: initialize additive variables */
        $thr_alm_clr = false;
        if ($thr_alm_ip = ($serv_infl->getValue() == ServInfl::SI_THRAFF)) {
            $alm_stat_v = $alm_stat->getValue();
            $max_cur_alm_stat_v = AlarmStatus::AS_CLEAR;
        }
        
        foreach ($cac_lst as $cac) {
            if ($cac->getAedId() != $aed_id) {
                continue;
            }
            $thr_cac = ($cac->getServInfl()->getValue() == ServInfl::SI_THRAFF);
            if ($thr_alm_ip && $thr_cac) {
                /* threshold alarm processing: delete cacs with alarm severity > reported one */
                $cur_alm_stat_v = $cac->getAlmStat()->getValue();
                if ($alm_stat_v < $cur_alm_stat_v) {
                    $cac->delete();
                    $thr_alm_clr = true;
                } elseif ($max_cur_alm_stat_v < $cur_alm_stat_v) {
                    $max_cur_alm_stat_v = $cur_alm_stat_v;
                }
            } elseif (!$thr_alm_ip && !$thr_cac && $cac->getAlmStat() == $alm_stat) {
                return GenericAdmin::EC_DUPL_INST;
            }
        }
        
        /* threshold alarm post-processing: only new cac if reported alarm severity > max current ones */
        if ($thr_alm_ip && $alm_stat_v <= $max_cur_alm_stat_v) {
            // if no threshold alarm clearance was done, eveything is none.
            // No further alarm processing necessary
            if (!$thr_alm_clr) return GenericAdmin::EC_DUPL_INST;
            else return GenericAdmin::EC_OK;
        }
        
        $cac = new CurrentAlarmCondition();
        
        $cac->setAmoId($amo->getId());
        $cac->setAedId($aed_id);
        $cac->setEvtTime($evt_time);
        $cac->setRecDate(date('Y-m-d H:i:s'));
        $cac->setAlmStat($alm_stat);
        $cac->setServInfl($serv_infl);
        
        $cac->save();
        return GenericAdmin::EC_OK;
    }
    
	static function cancelAlarm(
			InstAddr $inst_addr,
			$amh_id,
			$aed_id)
	{
		$amo = AlarmingManagedObjectQuery::create()->findOneByInstAddrVal($inst_addr->getValue());
		
		if ($amo == NULL) {
			$amo = new AlarmingManagedObject();

			$amo->setName($inst_addr);
			$amo->setInstAddr($inst_addr);
			$amo->setAmhId($amh_id);

			$amo->save();

		} else {
			$cac_lst = CurrentAlarmConditionQuery::create()->findByAmoId($amo->getId());
	
			$anything_deleted = false;
			foreach ($cac_lst as $cac) {
			    if ($aed_id == $cac->getAedId()) {
			        $cac->delete();
			        $anything_deleted = true;
			    }
			}
			if ($anything_deleted) return GenericAdmin::EC_OK;
		}
		return GenericAdmin::EC_NOSU_INST;
	}
}
?>