#!/bin/sh
# \
  exec oagwish "$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)]
set apsttk 1

APSApplication . -name "APS Status Operator Message Entry"
set status Ready...
APSScrolledStatus .status -parent .userFrame -textVariable status -packOption "-expand true -fill both" -width 110
frame .userFrame.f
pack .userFrame.f -fill x

ttk::label .userFrame.f.label1 -text "Last dump/trip reason or problem:"
entry .userFrame.f.entry1 -textvariable entry1 -fg black
ttk::label .userFrame.f.label2 -text "Problem update or activity:"
entry .userFrame.f.entry2 -textvariable entry2 -fg black
ttk::label .userFrame.f.label3 -text "Next fill info:"
entry .userFrame.f.entry3 -textvariable entry3 -fg black
ttk::label .userFrame.f.label4 -text "Next update at:"
entry .userFrame.f.entry4 -textvariable entry4 -fg black
grid .userFrame.f.label1 -row 0 -column 0 -sticky e
grid .userFrame.f.entry1 -row 0 -column 1 -sticky we
grid .userFrame.f.label2 -row 1 -column 0 -sticky e
grid .userFrame.f.entry2 -row 1 -column 1 -sticky we
grid .userFrame.f.label3 -row 2 -column 0 -sticky e
grid .userFrame.f.entry3 -row 2 -column 1 -sticky we
grid .userFrame.f.label4 -row 3 -column 0 -sticky e
grid .userFrame.f.entry4 -row 3 -column 1 -sticky we
grid columnconfigure .userFrame.f 1 -weight 1
APSButton .submitWithEmail -parent .userFrame -text "Submit" -width "" -command "Submit 1"
APSButton .submitWithoutEmail -parent .userFrame -text "Submit without xrayops email" -width "" -command "Submit 0"
APSButton .medm -parent .userFrame -text "MEDM" -width "" -command "exec medm -x -attach /usr/local/iocapps/adlsys/sr/operationsApp/opsMessage.adl &"



if {[catch {exec cavget -list=OPS:message5,OPS:message16,OPS:message4,OPS:message14,OPS:message15,OPS:message6,OPS:message17,OPS:message18 } results]} {
    wm withdraw .
    APSAlertBox .alert -errorMessage "Unable to link to PVs\n$results" -type error
    exit
}
set entry1a [lindex $results 0]; # last dump/trip reason
set entry1b [lindex $results 1]; # last dump/trip reason continued
set entry2a [lindex $results 2]; # problem update
set entry2b [lindex $results 3]; # problem update continued
set entry2c [lindex $results 4];
set entry3a [lindex $results 5]; # next fill info
set entry3b [lindex $results 6]; # next fill info continued
set entry4a [lindex $results 7]; # next update at

# set entry1 "<text> \[e.g., beam down, top-up aborted, high beam motion, etc.\]"
# set entry2 "<text> \[e.g., power supply repair, recovery of injectors, diagnosis of feedback problems.\]"
# set entry3 "<time>"
# set entry4 "<time>"
set entry1 [string trim "$entry1a $entry1b"]
set entry2 [string trim "$entry2a $entry2b $entry2c"]
set entry3 [string trim "$entry3a $entry3b"]
set entry4 [string trim "$entry4a"]
set status "Values read at [clock format [clock seconds]]"
# set e1 1
# set e2 1
# set e3 1
# set e4 1
# bind .userFrame.f.entry1 <FocusIn> {
#     if {$e1} {
#         set e1 0;
#         set entry1 ""
#         .userFrame.f.entry1 configure -fg black
#     }
# }
# bind .userFrame.f.entry2 <FocusIn> {
#     if {$e2} {
#         set e2 0;
#         set entry2 ""
#         .userFrame.f.entry2 configure -fg black
#     }
# }
# bind .userFrame.f.entry3 <FocusIn> {
#     if {$e3} {
#         set e3 0;
#         set entry3 ""
#         .userFrame.f.entry3 configure -fg black
#     }
# }
# bind .userFrame.f.entry4 <FocusIn> {
#     if {$e4} {
#         set e4 0;
#         set entry4 ""
#         .userFrame.f.entry4 configure -fg black
#     }
# }

if {[catch {pv linkw "entry1aPV" "OPS:message5" 10} results]} {
    wm withdraw .
    APSAlertBox .alert -errorMessage "Unable to link to PVs\n$results" -type error
    exit
}
update
set access [lindex [lindex [pv info entry1aPV access] 0] 1]
if {$access == "R"} {
    bell
    set status "This account cannot set the PVs. Try the asdops account."
}

proc Submit {email} {
    global entry1 entry2 entry3 entry4 access e1 e2 e3 e4
    global entry1a entry1b entry2a entry2b entry2c entry3a entry3b entry4a

    if {$access == "R"} {
        bell
        APSSetVarAndUpdate status "This account cannot set the PVs. Try the asdops account."
        #return
    }
#     if {$e1} {
#         set e1 0;
#         set entry1 ""
#         .userFrame.f.entry1 configure -fg black
#     }
#     if {$e2} {
#         set e2 0;
#         set entry2 ""
#         .userFrame.f.entry2 configure -fg black
#     }
#     if {$e3} {
#         set e3 0;
#         set entry3 ""
#         .userFrame.f.entry3 configure -fg black
#     }
#     if {$e4} {
#         set e4 0;
#         set entry4 ""
#         .userFrame.f.entry4 configure -fg black
#     }
    set limit 39
    set string $entry1
    foreach n {1a 1b} {
        if {[string length $string] <= $limit} {
            set entry$n $string
            set string ""
        } else {
            set i [string last " " $string $limit]
            if {$i != -1} {
                set entry$n [string range $string 0 [expr $i - 1]]
                set string [string range $string [expr $i + 1] end]
            } else {
                set entry$n $string
                set string ""
            }
        }
    }
    if {[string length $string] > 0} {
        bell
        APSSetVarAndUpdate status "Problem field [string length $string] characters too long for PVs."
        return
    }
    set string $entry2
    foreach n {2a 2b 2c} {
        if {[string length $string] <= $limit} {
            set entry$n $string
            set string ""
        } else {
            set i [string last " " $string $limit]
            if {$i != -1} {
                set entry$n [string range $string 0 [expr $i - 1]]
                set string [string range $string [expr $i + 1] end]
            } else {
                set entry$n $string
                set string ""
            }
        }
    }
    if {[string length $string] > 0} {
        bell
        APSSetVarAndUpdate status "Activity field [string length $string] characters too long for PVs."
        return
    }
    set string $entry3
    foreach n {3a 3b} {
        if {[string length $string] <= $limit} {
            set entry$n $string
            set string ""
        } else {
            set i [string last " " $string $limit]
            if {$i != -1} {
                set entry$n [string range $string 0 [expr $i - 1]]
                set string [string range $string [expr $i + 1] end]
            } else {
                set entry$n $string
                set string ""
            }
        }
    }
    if {[string length $string] > 0} {
        bell
        APSSetVarAndUpdate status "Estimated time of shutter enable field [string length $string] characters too long for PVs."
        return
    }
    set string $entry4
    foreach n {4a} {
        if {[string length $string] <= $limit} {
            set entry$n $string
            set string ""
        } else {
            set i [string last " " $string $limit]
            if {$i != -1} {
                set entry$n [string range $string 0 [expr $i - 1]]
                set string [string range $string [expr $i + 1] end]
            } else {
                set entry$n $string
                set string ""
            }
        }
    }
    if {[string length $string] > 0} {
        bell
        APSSetVarAndUpdate status "Next planned update field [string length $string] characters too long for PVs."
        return
    }
    set entry1aa [join [split $entry1a ","] "\\,"]
    set entry1bb [join [split $entry1b ","] "\\,"]
    set entry2aa [join [split $entry2a ","] "\\,"]
    set entry2bb [join [split $entry2b ","] "\\,"]
    set entry2cc [join [split $entry2c ","] "\\,"]
    set entry3aa [join [split $entry3a ","] "\\,"]
    set entry3bb [join [split $entry3b ","] "\\,"]
    set entry4aa [join [split $entry4a ","] "\\,"]
    #puts "cavput -list=OPS:message5=${entry1aa},OPS:message16=${entry1bb},OPS:message4=${entry2aa},OPS:message14=${entry2bb},OPS:message15=${entry2cc},OPS:message6=${entry3aa},OPS:message17=${entry3bb},OPS:message18=${entry4aa}"

    if {[catch {exec cavput -list=OPS:message5=${entry1aa},OPS:message16=${entry1bb},OPS:message4=${entry2aa},OPS:message14=${entry2bb},OPS:message15=${entry2cc},OPS:message6=${entry3aa},OPS:message17=${entry3bb},OPS:message18=${entry4aa}} results]} {
        APSSetVarAndUpdate status "Unable to set PVs\n$results"
        return
    }

    APSSetVarAndUpdate status "PVs updated at [clock format [clock seconds]]"
    if {$email} {
        set l1 [string trim "$entry1a $entry1b"]
        set l2 [string trim "$entry2a $entry2b $entry2c"]
        set l3 [string trim "$entry3a $entry3b"]
        set l4 [string trim "$entry4a"]
        set emailText "Problem: $l1\n"
        append emailText "Activity: $l2\n"
        append emailText "Estimated time of shutter enable: $l3\n"
        append emailText "Next planned update: $l4\n"
        set emailAddresses "xrayops@aps.anl.gov asdops@aps.anl.gov"
        # set emailAddresses "gfystro@anl.gov asdops@aps.anl.gov"
        foreach emailAddress $emailAddresses {
            catch {exec echo "$emailText" | mailx -r asdops@aps.anl.gov -s "APS Status Operator Message Update" $emailAddress} result
            APSSetVarAndUpdate status "Email sent to $emailAddress"
            APSSetVarAndUpdate status "Errors, if any: $result"
        }
    }
}
