import sys
import glob
from ConfigParser import RawConfigParser



def update_cfg(cfgparser, cfglist):
    if type(cfglist) is not list: cfglist = list(cfglist)
    for cfgfilename in cfglist:
        with open(cfgfilename) as f:
            for line in f.readlines():
                line = line.strip()
                if (len(line) > 0) and not line.startswith('/'):
                    split_comment = line.rsplit('//', 1)
                    if len(split_comment) > 1: 
                        line = split_comment[0].strip()
                        comment = split_comment[1].strip()
                    split_dot = line.split('.', 1)
                    if len(split_dot) is 2: 
                        component = split_dot[0].strip()
                        if component not in cfgparser.sections():
                            cfgparser.add_section(component)
                        split_equals = split_dot[1].split('=', 1)
                        if len(split_equals) is 2:
                            variable = split_equals[0].strip()
                            setting = split_equals[1].strip().strip(';')
                            cfgparser.set(component, variable, setting)
#                        else: print split_equals
#                    else: print split_dot
    

if __name__ == "__main__":
    # TODO: argparse
    vehicle='daphne'
    verbosity = 0

    nominal, mins, maxs, cfg = RawConfigParser(), RawConfigParser(), RawConfigParser(), RawConfigParser()
#    nominal.read(glob.glob('Config/nominal/*.cfg'))
#    mins.read(glob.glob('Config/nominal/min/*.cfg'))
#    maxs.read(glob.glob('Config/nominal/max/*.cfg'))

    update_cfg(nominal, glob.glob('Config/nominal/*.cfg'))
    update_cfg(mins, glob.glob('Config/nominal/min/*.cfg'))
    update_cfg(maxs, glob.glob('Config/nominal/max/*.cfg'))

    # TODO: options to check local, tagged, loaded

    update_cfg(cfg, glob.glob('Config/*.cfg'))
    update_cfg(cfg, glob.glob('Config/lrauv-{0}/*.cfg'.format(vehicle)))
    display_pre_deployment = True
    if display_pre_deployment:
        print '--------------------------------------------------------------'
        print 'Pre-deployment software check configuration settings for LRAUV {0}'.format(vehicle)
        print '--------------------------------------------------------------'
        msg = '{0}.{1} = {2}; nominal: {3}, normal range: {4} to {5}'
        for section in nominal.sections():
            for variable, setting in nominal.items(section):
                if variable != 'loadatstartup':
                    if verbosity > 0:
                        print msg.format(section, variable, setting, 
                                nominal.get(section, variable), 
                                mins.get(section, variable).split(' ')[0], # remove units for printing message
                                maxs.get(section, variable))
                    if float(cfg.get(section, variable).split(' ')[0]) < float(mins.get(section, variable).split(' ')[0]):
                        print '{0}.{1} is less than minimum established setting'.format(section,variable)
                    elif float(cfg.get(section, variable).split(' ')[0]) > float(maxs.get(section,variable).split(' ')[0]):
                        print '{0}.{1} is greater than maximum established setting'.format(section,variable)
                    elif cfg.get(section, variable) != nominal.get(section, variable):
                        print '{0}.{1} is not nominal setting'.format(section,variable)
        print '---------------------------'
        print 'Enabled components on LRAUV {0}'.format(vehicle)
        print '---------------------------'
        for section in nominal.sections():
            for variable, setting in nominal.items(section):
                if variable == 'loadatstartup':
                    if verbosity > 0:
                        print '{0}.{1} = {2}; nominal: {3}'.format(section, variable, cfg.get(section, variable), setting)
                    if setting != cfg.get(section, variable):
                        print 'WARNING: {0}.{1} is {2}, but nominal setting is {3}'.format(section, variable, cfg.get(section, variable), setting)
    
    show_logger = False
    if show_logger:
        print '---------------------------'
        print '{0} will report the following variables to shore:'.format(vehicle)
        print '---------------------------'
#        for variable, setting in cfg.items('logExpress'): 

    if verbosity > 1: cfg.write(sys.stdout)
