#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# This file is part of INGInious. See the LICENSE and the COPYRIGHTS files for
# more information about the licensing of this file.
#

""" Starts an agent """

import argparse
import logging

from zmq.asyncio import ZMQEventLoop, Context
import asyncio

from inginious.agent.mcq_agent import MCQAgent

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("backend", help="Address to the backend, in the form protocol://host:port. For example, tcp://127.0.0.1:2000", type=str)
    parser.add_argument("--friendly-name", help="Friendly name to help identify agent.", default="", type=str)
    parser.add_argument("--tasks", help="Path to the task directory. "
                                        "By default, it is ./tasks. You must ensure that this directory is synchronized at any time"
                                        "with the backend and the client", default="./tasks")
    parser.add_argument("-v", "--verbose", help="increase output verbosity",
                        action="store_true")
    args = parser.parse_args()

    # create logger
    logger = logging.getLogger("inginious")
    logger.setLevel(logging.INFO if not args.verbose else logging.DEBUG)
    ch = logging.StreamHandler()
    ch.setLevel(logging.INFO if not args.verbose else logging.DEBUG)
    formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
    ch.setFormatter(formatter)
    logger.addHandler(ch)

    # start asyncio and zmq
    loop = ZMQEventLoop()
    asyncio.set_event_loop(loop)
    context = Context()

    # Create agent
    agent = MCQAgent(context, args.backend, args.friendly_name, args.tasks)

    # Run!
    try:
        loop.run_until_complete(agent.run_dealer())
    except:
        pass
    finally:
        logger.info("Closing loop")
        loop.close()
        logger.info("Waiting for ZMQ to send remaining messages to backend (can take 1 sec)")
        context.destroy(1000)  # give zeromq 1 sec to send remaining messages
        logger.info("Done")