#!/usr/bin/env python

__author__ = "Subhav Pradhan"

import os, sys
import argparse, ConfigParser
import zmq, json
from chariot_runtime_libs import get_logger, mongo_connect, invoke_solver, solver_loop

def main():
    # Get python logger.
    logger = get_logger("chariot-me")

    argParser = argparse.ArgumentParser()

    argParser.add_argument("-c",
                           "--configFile",
                           help="CHARIOT configuration file to use.")

    argParser.add_argument("-i",
                           "--initialDeployment",
                           action="store_true",
                           help="Flag to indicate initial deployment.")

    argParser.add_argument("-l",
                           "--lookAhead",
                           action="store_true",
                           help="Flag to indicate look-ahead mode.")

    args = argParser.parse_args()

    mongoServer = None
    initialDeployment = False
    lookAhead = False

    # Set initialDeployment and lookAhead flag based on arguments.
    if args.initialDeployment is not None:
        logger.info ("Management Engine will compute initial deployment.")
        initialDeployment = args.initialDeployment
    if args.lookAhead is not None:
        logger.info ("Management Engine will run on look-ahead mode.")
        lookAhead = args.lookAhead

    # Set mongoServer information based on configFile information.
    if args.configFile is None:
        logger.info ("Configuration file not provided. Using default (localhost) mongo server.")
        mongoServer = "localhost"
    else:
        if os.path.isfile(args.configFile):
            logger.info ("Using configuration file: " + args.configFile)
            configParser = ConfigParser.ConfigParser()
            configParser.read(args.configFile)

            try:
                mongoServer = configParser.get("Services", "MongoServer")
                logger.info ("Using mongo server located on: " + mongoServer)
            except ConfigParser.NoOptionError, ConfigParser.NoSectionError:
                mongoServer = "localhost"
                logger.info ("Mongo server cannot be extracted from configuration file. Using: " + mongoServer)
        else:
            logger.error ("Cannot find configuration file.")
            sys.exit()

    logger.info ("Connecting to mongo server: " + mongoServer)
    client = mongo_connect(mongoServer)

    if client is not None:
        db = client["ConfigSpace"]
    else:
        logger.info ("MongoClient not constructed correctly")
        sys.exit()

    # Creating ZeroMQ context and client socket.
    zmq_context = zmq.Context()
    zmq_socket = zmq_context.socket(zmq.REQ)

    # Set receive timeout of 3 seconds.
    zmq_socket.setsockopt(zmq.RCVTIMEO, 3000)

    # Set linger for clean termination.
    zmq_socket.setsockopt(zmq.LINGER, 0)

    # If initial deployment, invoke solver. If not, start solver loop.
    if initialDeployment:
        invoke_solver(db, zmq_socket, initialDeployment, lookAhead)
    else:
        solver_loop(db, zmq_socket, mongoServer, lookAhead)

    # Close socket and terminate context.
    zmq_socket.close()
    zmq_context.term()

if __name__ == "__main__":
    main()
