#!/usr/bin/python3 -s
import os
import os.path
import sys
import webbrowser
from dballe_web.webserver import Application
from tornado.options import define, options
from tornado.platform.asyncio import AsyncIOMainLoop
import tornado.httpserver
import tornado.netutil
import asyncio
AsyncIOMainLoop().install()

VERSION = "0.2"


class DballeWeb:
    def __init__(self):
        self.db_url = options.db
        self.web_host = "localhost"
        self.web_port = options.web_port

    def setup(self):
        # Set up web server on a free port
        self.application = Application(self.db_url)

        if self.web_port is None:
            sockets = tornado.netutil.bind_sockets(0, '127.0.0.1')
            self.web_port = sockets[0].getsockname()[:2][1]
            server = tornado.httpserver.HTTPServer(self.application)
            server.add_sockets(sockets)
        else:
            server = tornado.httpserver.HTTPServer(self.application)
            server.listen(self.web_port)

    @asyncio.coroutine
    def async_setup(self):
        yield from self.application.async_setup()


def main():
    # define("web_host", default="127.0.0.1", help="listening hostname for web interface")
    define("web_port", type=int, default=None, help="listening port for web interface")
    define("db", type=str, metavar="dballe_url", default=os.environ.get("DBA_DB"),
           help="DB-All.e database to connect to")
    options.parse_command_line()

    if not options.db:
        print("Please provide a database URL with --db", file=sys.stderr)
        options.print_help()
        return 1

    app = DballeWeb()
    app.setup()
    url = "http://{}:{}/".format(app.web_host, app.web_port)
    print("dballe-web URL:", url)
    webbrowser.open(url)

    def _on_init():
        asyncio.get_event_loop().create_task(app.async_setup())
    asyncio.get_event_loop().call_soon(_on_init)
    asyncio.get_event_loop().run_forever()


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