"""Mock single-user server for testing

basic HTTP Server that echos URLs back,
and allow retrieval of sys.argv.

Used by the mock spawners found in `mocking.py` file.

Handlers and their purpose include:

- EchoHandler: echoing URLs back
- ArgsHandler: allowing retrieval of `sys.argv`.

"""
import json
import os
import sys
from urllib.parse import urlparse

from tornado import httpserver, ioloop, log, web
from tornado.options import options

from ..utils import make_ssl_context
from .mockservice import EnvHandler


class EchoHandler(web.RequestHandler):
    def get(self):
        self.write(self.request.path)


class ArgsHandler(web.RequestHandler):
    def get(self):
        self.write(json.dumps(sys.argv))


def main():
    url = urlparse(os.environ["JUPYTERHUB_SERVICE_URL"])
    options.logging = 'debug'
    log.enable_pretty_logging()
    app = web.Application(
        [(r'.*/args', ArgsHandler), (r'.*/env', EnvHandler), (r'.*', EchoHandler)]
    )

    ssl_context = None
    key = os.environ.get('JUPYTERHUB_SSL_KEYFILE') or ''
    cert = os.environ.get('JUPYTERHUB_SSL_CERTFILE') or ''
    ca = os.environ.get('JUPYTERHUB_SSL_CLIENT_CA') or ''

    if key and cert and ca:
        import ssl

        ssl_context = make_ssl_context(
            key, cert, cafile=ca, purpose=ssl.Purpose.CLIENT_AUTH
        )
        assert url.scheme == "https"

    server = httpserver.HTTPServer(app, ssl_options=ssl_context)
    log.app_log.info(f"Starting mock singleuser server at {url.hostname}:{url.port}")
    server.listen(url.port, url.hostname)
    try:
        ioloop.IOLoop.instance().start()
    except KeyboardInterrupt:
        print('\nInterrupted')


if __name__ == '__main__':
    main()
