#! /usr/bin/env python
################################################################################
# Script Name: exhafs_msg_check.py
# Authors: NECP/EMC Hurricane Project Team and UFS Hurricane Application Team
# Abstract:
#   This script checks storm messages and sends an alert email if encountering
#   an issue.
################################################################################
import os, sys, re, logging, glob

if 'USHhafs' in os.environ:
    sys.path.append(os.environ['USHhafs'])
elif 'HOMEhafs' in os.environ:
    sys.path.append(os.path.join(os.environ['HOMEhafs'],'ush'))
else:
    guess_HOMEhafs=os.path.dirname(os.path.dirname(
            os.path.realpath(__file__)))
    guess_USHhafs=os.path.join(guess_HOMEhafs,'ush')
    sys.path.append(guess_USHhafs)

import produtil.setup, produtil.log, produtil.dbnalert
from produtil.run import batchexe, run

def send_email(email_list,subject,email_from=None,
               content_text=None,content_file=None,
               logger=None):
    """!Send email function"""

    if content_file:
        cmd='mail.py -s '+ '"' + subject + '"' + ' -v "' + email_list + '" < content_file '
    else:
        assert(content_text is not None)
        with open('tempfile','wt') as f:
            f.write(content_text)
        cmd='mail.py -s '+ '"' + subject + '"' + ' -v "' + email_list + '" < tempfile '
    print('cmd')
    print(repr(cmd))
    status=os.system(cmd)
    return status

def read_alert_message(alert_file):
    """!Get email content from the alert file"""
    with open(alert_file,'rt') as f:
        content=f.read()
    return content

def main():
    logger=logging.getLogger('Sending_Alert_Email')
    email_from=os.environ.get('MAILFROM', 'nco.spa@noaa.gov')
    alert_email_list=os.environ.get('MAILTO','sdm@noaa.gov')
    messagedir=os.environ.get('COMINmsg')
    nhcdir=os.environ.get('COMINnhc')
    jtwcdir=os.environ.get('COMINjtwc')
    patrn=str(sys.argv[1])+" "+str(sys.argv[2])
    message=0
    for ff in glob.glob(os.path.join(messagedir,'message?')):
        content=read_alert_message(ff)
        print(ff + " is: " + content)
        if re.search(patrn, content):
            message=message+1
    ymd="20"+str(sys.argv[1])
    hh=str(sys.argv[2])+"Z"
    print("number of message files for " + patrn + "Z =", message)

    #NHC message
    nhc_message=0
    for ff in glob.glob(os.path.join(nhcdir,'storm?')):
        content=read_alert_message(ff)
        if re.search(patrn, content):
            nhc_message=nhc_message+1
    print("number of NHC requested storms=",nhc_message)

    #JTWC message
    jtwc_message=0
    for ff in glob.glob(os.path.join(jtwcdir,'storm?')):
        content=read_alert_message(ff)
        if re.search(patrn, content):
            jtwc_message=jtwc_message+1
    print("number of JTWC requested storms from message=",jtwc_message)

    if message == 0 and nhc_message+jtwc_message > 0:
        subject='FATAL ERROR: No message created for active storm for cycle: '+ymd+hh
        alert_message='Dear SDM: There is no message created from active storms yet on WCOSS2 in ' + messagedir + ' . Please Check if setup_hurricane has been properly executed'
        status=send_email(alert_email_list,subject,email_from=email_from,
                      content_text=alert_message,logger=logger)
        logger.error('FATAL ERROR: No message created for active storm in ',messagedir)
        sys.exit(2)

if __name__ == '__main__':
    main()