#!/usr/bin/env python3
import logging
import os

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'core.settings')

import django
import uvicorn

django.setup()

from helper import init_loop
from mail.protocol import LMTPHandler
from mail.socket import UnixSocketLMTPController


class UvicornServer(uvicorn.Server):
    def install_signal_handlers(self):
        pass


async def web(loop):
    log_config = uvicorn.config.LOGGING_CONFIG
    log_config["handlers"]["default"] = {"class": "logging.FileHandler", "filename": "web.log", "formatter": "default"}
    log_config["handlers"]["access"] = {"class": "logging.FileHandler", "filename": "web-access.log",
                                        "formatter": "access"}
    config = uvicorn.Config("core.asgi:application", uds="web.sock", log_config=log_config)
    server = UvicornServer(config=config)
    await server.serve()


async def lmtp(loop):
    import grp
    log = logging.getLogger('mail.log')
    log.addHandler(logging.FileHandler('mail.log'))
    # log.setLevel(logging.WARNING)
    log.setLevel(logging.INFO)
    log.info("Starting LMTP server")
    server = await UnixSocketLMTPController(LMTPHandler(), unix_socket='lmtp.sock', loop=loop).serve()

    addrs = ', '.join(str(sock.getsockname()) for sock in server.sockets)
    log.info(f'Serving on {addrs}')

    try:
        os.chmod('lmtp.sock', 0o775)
        current_uid = os.getuid()
        posix_gid = grp.getgrnam('postfix').gr_gid
        os.chown('lmtp.sock', current_uid, posix_gid)
    except Exception as e:
        log.error(e)

    async with server:
        await server.serve_forever()
    log.info("LMTP done")


def main():
    import sdnotify
    import setproctitle
    import os
    setproctitle.setproctitle("c3lf-sys3")
    log = logging.getLogger('server.log')
    log.addHandler(logging.FileHandler('server.log'))
    log.setLevel(logging.DEBUG)
    log.info("Starting server")
    loop = init_loop()
    loop.create_task(web(loop))
    #    loop.create_task(tcp(loop))
    loop.create_task(lmtp(loop))
    n = sdnotify.SystemdNotifier()
    n.notify("READY=1")
    log.info("Server ready")
    try:
        loop.run_forever()
    finally:
        loop.close()
    try:
        os.remove("lmtp.sock")
    except Exception as e:
        log.error(e)
    try:
        os.remove("web.sock")
    except Exception as e:
        log.error(e)
        log.error(e)
    logging.info("Server stopped")

    logging.shutdown()


if __name__ == '__main__':
    main()