#!/usr/bin/python3
import json
import re
import subprocess
from subprocess import Popen, PIPE
import time
import datetime
import os
from os import path
import sys
from collections import defaultdict
from collections import OrderedDict
from decimal import Decimal

try:
    from viavi.mts.device_th import send_od_to_otu_logging
except ImportError:
    from jdsu.mts.device_th import send_od_to_otu_logging

try:
    from viavi.mts.ScpiAccess import ScpiAccess, EsrError
except ImportError:
    from jdsu.mts.ScpiAccess import ScpiAccess, EsrError

#############################################################
def userlog_ufom_change_mode(mond_time, monitoring_info, lrc):
    ufom_script = os.path.abspath(__file__)
    source_time =  ufom_script +" " + mond_time
    send_od_to_otu_logging("", source_time, monitoring_info)
    return True


#############################################################################
def send_status_to_console(resp_msg):
    sys.stdout.write(json.dumps(resp_msg, sort_keys=False, indent=4))
    sys.stdout.write("\n")
    sys.stdout.flush()
    return True

#############################################################################
def set_ufom_otu_mode(cmnd):
    mrc = 0
    ufom_status = []
    try:
        #
        #  Set UFOM OTU Mode
        #  "OTU:CALIB:RFTY cmnd"
        mode_req_status = otu_p.SendCommand("OTU:CALIB:RFTY %s"%cmnd)
        ufom_status = \
             OrderedDict([("status" , "success") ])  
    except Exception as error_e:
        mrc += 1
        ufom_status = \
             OrderedDict([("status" , "failure"), \
                          ("message", ACCESS_ERROR)])
    return (ufom_status, mrc)
    
#############################################################################
def check_ufom_licence():
    mrc = 0
    ufom_status = []
    lc_state_available = 'AVAILABLE'
    lc_state_invalid ='invalid license'

    try:
        #
        #  Open SCPI connections
        otu_p = ScpiAccess("localhost", 1400, 30, "*PASS \"RTU\"\"PASSWORD\"\n")
        #  Get UFOM Monitoring Status
        #  "OTU:SYST:OPTION:STATUS? ULTRAFAST_MON"
        license_status = otu_p.SendAndReadCommand("OTU:SYST:OPTION:STATUS? ULTRAFAST_MON")
        status_rsp = str(license_status).lower()
        if status_rsp != lc_state_available.lower():
            mrc = 1
            ufom_status = \
                OrderedDict([("status" , "failure"), \
                             ("message", lc_state_invalid)])
            #otu_p.disconnect()
        else:
            mrc = 0
            #otu_p.disconnect()
    except Exception as error_e:
        mrc = 1
        ufom_status = \
             OrderedDict([("status" , "failure"), \
                          ("message", ACCESS_ERROR)])
    return (ufom_status, mrc)

##############################################################################
#<><><><><><><>-------<><><><><><><>-------<><><><><><><>-------<><><><><><><>
if __name__ == "__main__":
    MAX_SCRIPTINPUTS = 2
    MAX_NUM_OF_INPUT_ARGUMENTS = MAX_SCRIPTINPUTS - 1
    FAILED_STATUS = "failure"
    SUCCESS_STATUS = "success"
    ACCESS_ERROR = "Command Access Error"

    ufom_monitoring_lic_state = ()
    otu_modes = ['smartotu', 'ufom']
    err_details = ""
    grc = 0

    start_time_date = time.strftime("%c")
    start_time = time.time()

    #
    #  Check if UFOM Licence is available
    ufom_monitoring_lic_state, grc = check_ufom_licence()
    if ( grc > 0 ):
       userlog_ufom_change_mode(start_time_date, \
                                ufom_monitoring_lic_state, \
                                grc)
       send_status_to_console(ufom_monitoring_lic_state)
       exit(grc)
    #
    #  Validate the the number of input arguments
    mode_args = len(sys.argv)
    if mode_args != MAX_SCRIPTINPUTS:
        grc = 1
        err_details = "UFOM Change OTU Mode - Number of input arguments must be " + str(MAX_NUM_OF_INPUT_ARGUMENTS)
        ufom_status = \
             OrderedDict([("status" , "failure"), \
                           ("message", err_details)])
        userlog_ufom_change_mode(start_time_date, \
                                 ufom_status, \
                                 grc)
        send_status_to_console(ufom_status)
        exit(grc)
    #
    #
    otu_mode = sys.argv[1]
    selected_otu_mode = otu_mode.lower()
    if selected_otu_mode in otu_modes:
        #
        #  Open SCPI connections
        otu_p = ScpiAccess("localhost", 1400, 30, "*PASS \"RTU\"\"PASSWORD\"\n")
        #
        #  Global return code
        mode_change_result = OrderedDict()    
        #
        #  Set OTU Mode state
        mode_change_result, grc = set_ufom_otu_mode(selected_otu_mode)
        #
        #
        state_status = OrderedDict([("req parameter" , str(sys.argv[1])), \
                           ("cli response", mode_change_result)])
        userlog_ufom_change_mode(start_time_date,\
                                 state_status, \
                                 grc)
    else:
        grc = 1
        err_details =  "Input parameter must be SmartOTU or UFOM"
        mode_change_result = \
             OrderedDict([("status" , "failure"), \
                           ("message", err_details)])
        userlog_ufom_change_mode(start_time_date, \
                                 mode_change_result, \
                                 grc)
    send_status_to_console(mode_change_result)
    #
    #
    exit (grc)
