#!python
# -*- coding: utf-8 -*-
import os

from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
import tornado.options
from tornado.options import options, define

define("address", default="localhost", help="run on the given address")
define("port", default=8888, help="run on the given port", type=int)
define("dir", help="dir with api definitions")
define("debug", help="", default=False, type=bool)
define("application_data", help="Application data file",
       default="application.json")
define("num_processes", help="Number of child processes", default=1, type=int)
define("custom_provider", help="Custom response provider")


def command_line_options():
    tornado.options.parse_command_line()

    if options.dir is None:
        print("!! Specify API directory (--dir=/directory/for/api)\n")
        tornado.options.print_help()
        return False
    elif not options.dir.endswith(os.path.sep):
        options.dir = "%s%s" % (options.dir, os.path.sep)

    if not os.path.exists(options.dir):
        print("Error: Directory: '%s' doesn't exists" % options.dir)
        return False

    return True


def main():
    if not command_line_options():
        return

    if options.debug:
        parentdir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
        os.sys.path.insert(0, parentdir)

    try:
        from mock_server.application import Application
    except ImportError as e:
        if options.debug:
            raise
        print("%s\nTry run with --debug" % str(e))
        return

    app = Application(options.port, options.address,
                      options.dir, options.debug, options.application_data,
                      options.custom_provider)
    print("Serving on %s:%s.." % (options.address, options.port))

    server = HTTPServer(app)
    server.bind(options.port, options.address)
    server.start(options.num_processes)
    IOLoop.instance().start()


if __name__ == "__main__":
    main()
