#!/usr/bin/env python3
"""
Run lacmus api or ui wsgi application.
"""
from gevent import monkey
monkey.patch_all()

import argparse
import os
import logging

from gevent import wsgi, socket


def main():
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument('--skynet-path',
                        help='path to root of skynet directory. '
                             'specify this for using skynet logger. '
                             'debug logging to stderr will be used '
                             'otherwise')
    parser.add_argument('app', choices=['ui', 'api'])
    args = parser.parse_args()

    if not args.skynet_path:
        logging.basicConfig(
            level=logging.DEBUG,
            format='%(asctime)-15s %(name)s %(levelname)s %(message)s'
        )
    else:
        import sys
        sys.path.append(args.skynet_path)
        from api.logger import SkynetLoggingHandler
        handler = SkynetLoggingHandler(app="lacmus",
                                       filename="lacmus-%s.log" % args.app)
        logging.root.addHandler(handler)
        logging.root.setLevel(logging.INFO)
        logging.getLogger('werkzeug').setLevel(logging.ERROR)

    try:
        create_and_run_server(args.app)
    except:
        logging.root.exception('')


def create_and_run_server(app_name):
    if app_name == 'api':
        from lacmus2.web.api import make_app
    elif app_name == 'ui':
        from lacmus2.web.app import make_app

    app = make_app()

    app.logger.info('app config: %r', dict(app.config))

    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)
        os.chmod(addr, app.config['UDS_LISTEN_ADDRESS_FILE_MODE'])
        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)

    gevent_logger = logging.getLogger('gevent')
    gevent_logger.setLevel(logging.WARNING)
    server = wsgi.WSGIServer(sock, app, log=gevent_logger)

    try:
        server.serve_forever()
    except KeyboardInterrupt:
        pass

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


if __name__ == '__main__':
    main()
