#!/usr/bin/python3 -OO
# -*- encoding: utf-8 -*-
"""
iep-collectord
==============
Telemetry-collection services for Intelligent Endpoints.
"""
import logging
import os
import sys
import time
import traceback

import iep_collector.config
import iep_collector.location
import iep_collector.mqtt
import iep_collector.setup

_logger = logging.getLogger('iep-collector')

if __name__ == '__main__':
    import optparse
    parser = optparse.OptionParser()
    parser.add_option("--config", help="specify an alternate configuration file", dest="config", default="/etc/3d-p/iep-collector/iep-collector.conf")
    parser.add_option("--debug", help="output logging information at the DEBUG level", dest="debug", action="store_true", default=False)
    parser.add_option("--foreground", help="disable daemon mode, if set, and enable console output", dest="foreground", action="store_true", default=False)
    (parser_options, args) = parser.parse_args()
    del parser
    del args
    
    config_data = iep_collector.config.bind_config_data(parser_options.config)
    
    if not parser_options.foreground:
        iep_collector.setup.daemonise()
        
    iep_collector.setup.setup_logging(config_data.logging, parser_options)
    _logger.warning("=" * 40)
    _logger.warning("=" * 40)
    _logger.warning("System startup in progress...")
    
    pidfile = config_data.system['pidfile']
    if pidfile:
        iep_collector.setup.pid_bind(pidfile)
    iep_collector.setup.bind_signal_handlers()
    
    try:
        iep_collector.mqtt.init(config_data.mqtt)
        iep_collector.location.init(config_data.state['location'])
        _logger.debug("Location-service configured")
        
        #add module search-paths
        for path in config_data.tests['modules']:
            sys.path.append(os.path.dirname(path)) #just the parent; we need the leaf for disambiguation
        iep_collector.setup.session_start(config_data.tests, config_data.output)
        _logger.debug("Session configured")
        
        del parser_options
        del config_data
        
        _logger.info("Beginning normal operation...")
        last_minute = int(time.time()) / 60
        while iep_collector.setup.ALIVE:
            current_minute = int(time.time()) / 60
            if current_minute != last_minute: #Minute rolled over; some tests may need to reconfigure
                iep_collector.setup.session_update_environment()
            last_minute = current_minute
            
            time.sleep(1)
    except KeyboardInterrupt:
        _logger.warning("System shutdown requested via keyboard interrupt")
    except Exception:
        _logger.critical("System shutdown triggered by unhandled exception:\n" + traceback.format_exc())
    finally:
        iep_collector.setup.session_stop()
        if pidfile:
            iep_collector.setup.pid_unbind(pidfile)
        _logger.warning("System shutdown complete")
        
