#!/usr/bin/env python3
"""
Run a wsgi application.
"""
import argparse
import importlib
import logging


def main():
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument('-g', '--gevent', action='store_true',
                        help='Use gevent')
    parser.add_argument('-d', '--debug', action='store_true',
                        help='be more verbose')
    parser.add_argument('app')
    args = parser.parse_args()
    if args.gevent:
        # it's crucial to do this before importing actual app module
        from gevent import monkey
        monkey.patch_all()

    if args.app == 'api':
        from genisys.web.api import make_app
    elif args.app == 'ui':
        from genisys.web.app import make_app
    else:
        try:
            appmod = importlib.import_module(args.app)
        except ImportError as exc:
            parser.error(str(exc))
        make_app = appmod.make_app

    if args.debug:
        logging.basicConfig(
            level=logging.DEBUG,
            format='%(asctime)-15s %(name)s %(levelname)s %(message)s'
        )
    else:
        logging.basicConfig(level=logging.INFO,
                            format='%(name)s %(levelname)s %(message)s')
        logging.getLogger('werkzeug').setLevel(logging.ERROR)

    app = make_app()

    if args.gevent:
        import os
        from gevent import wsgi, socket

        if 'WSGI_LOCK_PORT' in app.config:
            sock = socket.socket()
            sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            sock.bind(('127.0.0.1', app.config['WSGI_LOCK_PORT']))
            lock_sock = sock  # noqa

        addr = app.config['WSGI_LISTEN_ADDRESS']
        if isinstance(addr, str):
            if os.path.exists(addr):
                os.unlink(addr)
            sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
            sock.bind(addr)
            sock.listen(socket.SOMAXCONN)
        else:
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            sock.bind(addr)
            sock.listen(socket.SOMAXCONN)

        server = wsgi.WSGIServer(
            sock, app,
            log=logging.getLogger('gevent') if args.debug else None
        )
        try:
            server.serve_forever()
        except KeyboardInterrupt:
            pass
    else:
        app.run(*app.config['WSGI_LISTEN_ADDRESS'], threaded=True)

    if hasattr(app, 'cleanup'):
        app.cleanup()


if __name__ == '__main__':
    main()
