#!/usr/bin/env python

import argparse
import logging
import os
import sys
import tornado.ioloop
import tornado.httpserver
import tornado.web

from grouper.models import get_db_engine, Session
from grouper.util import get_loglevel

import grouper.fe
from grouper.fe.routes import HANDLERS
from grouper.fe.util import get_template_env
from grouper.fe.settings import settings


sa_log = logging.getLogger("sqlalchemy.engine.base.Engine")


class Application(tornado.web.Application):
    def __init__(self, *args, **kwargs):
        self.my_settings = kwargs.pop("my_settings", {})
        super(Application, self).__init__(*args, **kwargs)


def main(argv):

    parser = argparse.ArgumentParser(description="Grouper Web Server.")
    parser.add_argument("-c", "--config", default="/etc/grouper.yaml",
                        help="Path to config file.")
    parser.add_argument("-v", "--verbose", action="count", default=0, help="Increase logging verbosity.")
    parser.add_argument("-q", "--quiet", action="count", default=0, help="Decrease logging verbosity.")
    parser.add_argument("-V", "--version", action="version",
                        version="%%(prog)s %s" % grouper.__version__,
                        help="Display version information.")
    parser.add_argument("-p", "--port", type=int, default=None, help="Override port in config.")

    args = parser.parse_args()
    settings.update_from_config(args.config, "fe")

    if settings.debug and settings.num_processes > 1:
        logging.fatal("Debug mode does not support multiple processes.")
        sys.exit(1)

    log_level = get_loglevel(args)
    logging.basicConfig(
        level=log_level,
        format=settings.log_format,
    )

    if log_level < 0:
        sa_log.setLevel(logging.INFO)

    tornado_settings = {
        "static_path": os.path.join(os.path.dirname(grouper.fe.__file__), "static"),
        "debug": settings.debug,
        "xsrf_cookies": True,
    }

    template_env = get_template_env()

    db_engine = get_db_engine(settings.database)
    Session.configure(bind=db_engine)

    my_settings = {
        "db_engine": db_engine,
        "db_session": Session,
        "template_env": template_env,
    }

    application = Application(HANDLERS, my_settings=my_settings, **tornado_settings)

    port = args.port or settings.port

    logging.info(
        "Starting application server with %d processes on port %d",
        settings.num_processes, port
    )
    server = tornado.httpserver.HTTPServer(application)
    server.bind(port)
    server.start(settings.num_processes)
    try:
        tornado.ioloop.IOLoop.instance().start()
    except KeyboardInterrupt:
        tornado.ioloop.IOLoop.instance().stop()
    finally:
        print "Bye"


if __name__ == "__main__":
    main(sys.argv)
