#!/bin/sh  
# \
exec oagtclsh "$0" "$@"

set auto_path [linsert $auto_path 0 /usr/local/oag/apps/lib/$env(HOST_ARCH)]
set auto_path [linsert $auto_path 0 /usr/local/oag/lib_patch/$env(HOST_ARCH)]
APSStandardSetup
APSDefineMonitoringVariables

if !$apsDataManagerNormalEmailOn {
    APSSendEMail -message "Warning: data logger check script is disabled." \
      -address $apsDataManagerNormalEmail -subject "data logger check disabled"
    return
}

# check for configuration file
set configurationFile $apsDataLoggerConfigDir/timeSeries.config
if ![file exists $configurationFile] {
    set message "checkLoggerInputs: $configurationFile not found"
    APSSendDataLoggerErrorEmail -message $message 
    return -code error $message
}

proc checkLoggerFile {monitorFile} {
    global apsDataManagerNormalEmail env
    set epicsHostAddrList ""
    if {[info exists env(EPICS_CA_ADDR_LIST)]} {
        set epicsHostAddrList $env(EPICS_CA_ADDR_LIST)
    }
    set errorsFound 0
    set tmpFile /tmp/[APSTmpString]
    if ![file exists $monitorFile] {
        set errorsFound 1
        set message "checkLoggerInputs: $monitorFile not found"
        APSSendEMail -message $message -address $apsDataManagerNormalEmail -subject "Data logger PV problem"
        return 1
    }
    if {[file dirname [file dirname $monitorFile]] == "/home/helios/oagData/logging/Beamlines"} { return 0 }
    if {($monitorFile == "/home/helios/oagData/logging/BunchPurityWF/BunchPurityWF.mon")} { return 0 }
    if {($monitorFile == "/home/helios/oagData/logging/linacRFWF/liL1RfWf.mon")} { return 0 }
    if {($monitorFile == "/home/helios/oagData/logging/linacRFWF/liL2RfWf.mon")} { return 0 }
    if {($monitorFile == "/home/helios/oagData/logging/linacRFWF/liL3RfWf.mon")} { return 0 }
    if {($monitorFile == "/home/helios/oagData/logging/linacRFWF/liL4RfWf.mon")} { return 0 }
    if {($monitorFile == "/home/helios/oagData/logging/linacRFWF/liL5RfWf.mon")} { return 0 }
    if {($monitorFile == "/home/helios/oagData/logging/parRFWF/parRFWF.mon")} { return 0 }
    if {($monitorFile == "/home/helios/oagData/logging/srInjCycle/srInjCycle.mon")} { return 0 }
    if {($monitorFile == "/home/helios/oagData/logging/DMM/DMM.mon") || ($monitorFile == "/home/helios/oagData/logging/Building375/Building375.mon") || ($monitorFile == "/home/helios/oagData/logging/Building382/Building382.mon")} {
        set env(EPICS_CA_ADDR_LIST) "164.54.8.144"
    }

    if {[pwd] == "/home/helios/oagData/Alarms"} {
        if [catch {exec sddsconvert $monitorFile -pipe=out -retain=column,ControlName -delete=parameter,* \
                     | sddspvasaverestore -pipe -save -pend=10 \
                     | sddsprocess -pipe -nowarning -match=column,CAError=y \
                     -print=parameter,Filename,$monitorFile \
                     | sddsconvert -pipe -ascii \
                     | tee $tmpFile \
                     | sdds2stream -pipe -rows } result] {
            set errorsFound 1
            set message "checkLoggerInputs: $monitorFile: $result"
            APSSendEMail -message $message -address $apsDataManagerNormalEmail -subject "Data logger PV problem"
        }      
    } else {
        if [catch {exec sddsconvert $monitorFile -pipe=out -retain=column,ControlName -delete=parameter,* \
                     | sddssnapshot -pipe -ezcaTiming=0.01,1000 \
                     | sddsprocess -pipe -nowarning -match=column,CAError=y \
                     -print=parameter,Filename,$monitorFile \
                     | sddsconvert -pipe -ascii \
                     | tee $tmpFile \
                     | sdds2stream -pipe -rows } result] {
            set errorsFound 1
            set message "checkLoggerInputs: $monitorFile: $result"
            APSSendEMail -message $message -address $apsDataManagerNormalEmail -subject "Data logger PV problem"
        }
    }
    if {($monitorFile == "/home/helios/oagData/logging/DMM/DMM.mon") || ($monitorFile == "/home/helios/oagData/logging/Building375/Building375.mon") || ($monitorFile == "/home/helios/oagData/logging/Building382/Building382.mon")} {
        if {$epicsHostAddrList == ""} {
            unset env(EPICS_CA_ADDR_LIST)
        } else {
            set env(EPICS_CA_ADDR_LIST) $epicsHostAddrList
        }
    }
    set badRows [lindex [split $result] 0]
    if {$badRows!=0} {
        catch {file copy -force $tmpFile $monitorFile.prob} 
        set errorsFound 1
        #APSSendEMail -message "Analysis of $monitorFile reveals $badRows bad entries" -subject "Data logger PV problem" -address $apsDataManagerNormalEmail
    }
    file delete -force $tmpFile
    return $errorsFound
}

cd /home/helios/oagData/Alarms
foreach file [lsort [glob -nocomplain *.alog]] {
    if [checkLoggerFile $file] {
           set errorsFound 1
    }
}

# load configuration file and make list of monitor input files
if [catch {sdds load $configurationFile configData} result] {
    set message "checkLoggerInputs: $result"
    APSSendDataLoggerErrorEmail -message $message
    return -code error $message
}
   
foreach column {doRun doOnePvPerFileRun subDirectory rootname GroupName} {
    set ${column}List [lindex $configData(Column.$column) 0]
}
set errorsFound 0
foreach doRun $doRunList doOnePvPerFileRun $doOnePvPerFileRunList subDir $subDirectoryList rootname $rootnameList group $GroupNameList {
    if {!$doRun && !$doOnePvPerFileRun} continue
    if {[file dirname $subDir] == "logonchange"} continue
    set monitorFile $apsOAGDataDir/$subDir/$rootname.mon
    if {[file dirname $subDir] == "glitchLogs"} {
        if {[file exists $apsOAGDataDir/$subDir/$rootname.atrig]} {
            set monitorFile $apsOAGDataDir/$subDir/$rootname.atrig
        }
    }
    if [checkLoggerFile $monitorFile] {
        set errorsFound 1
    }
}

if !$errorsFound {
    APSSendEMail -message "No data logger file errors were found" -subject "Data logger PV scan" \
      -address $apsDataManagerNormalEmail
}
