#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import click
import sys
import os
from pathlib import Path


# fmt: off
@click.command()
@click.option('--name', '-n',
                            default=None,
                            type=str,
                            help="Onion Service Name")
@click.option('--onion-domain', '-od',
                            default=None,
                            type=str,
                            help="Onion domain where TFS will be published")
@click.option('--file-path', '-fp',
                            default=None,
                            type=str,
                            help="Path to share")
@click.option('--dev',
                            default=False,
                            type=bool,
                            help="Run in development mode (Default: 0)")
# fmt: on
def main(name, onion_domain, file_path, dev):
    if not name:
        click.echo("Error: You must specify a name.")
        click.echo(f"run {sys.argv[0]} --help for more info.")
        sys.exit(1)

    if not onion_domain:
        click.echo("Error: Onion domain is required")
        click.echo(f"run {sys.argv[0]} --help for more info.")
        sys.exit(1)

    instance_name = name
    os.environ["INSTANCE_NAME"] = instance_name
    os.environ["ONION_DOMAIN"] = onion_domain

    # Check if another instance running have same name
    base_dir = Path(__file__).resolve().parent

    if os.path.exists(base_dir / f"pid/{instance_name}.pid"):
        click.echo(
            'Error: Another instance is already using name "%s"' % instance_name
        )
        sys.exit(1)

    if file_path is None:
        click.echo(f"Error: files-path must be set.")
        click.echo(f"run {sys.argv[0]} --help for more info.")
        sys.exit(1)

    media_root = file_path

    # Set environment vars for django settings
    os.environ["MEDIA_ROOT"] = media_root
    os.environ["DEBUG"] = "1" if dev else "0"

    run_webserver(instance_name, dev)


def run_webserver(instance_name, dev=True):
    from main import app, BASE_DIR
    if dev:
        # Dev
        app.run(debug=True)
        quit()
    else:
        import atexit
        from gunicorn.app.base import BaseApplication

        def stop_webserver():
            # Remove pid file in case it exists
            try:
                os.remove(BASE_DIR / f"pid/{instance_name}.pid")
            except:  # noqa
                pass

            quit()

        class TFSApp(BaseApplication):
            def load_config(self):
                self.cfg.set("bind", f"unix:/var/run/tfs_{instance_name}.sock")
                self.cfg.set("workers", 2)
                self.cfg.set("loglevel", "error")
                # self.cfg.set("loglevel", "debug")  # dev
                # self.cfg.set("bind", f"0.0.0.0:8888")  # dev

            def load(self):
                return app

            def run(self):
                pid = os.getpid()
                pid_file = BASE_DIR / f"pid/{instance_name}.pid"
                with open(pid_file, "w") as f:
                    f.write(str(pid))
                atexit.register(stop_webserver)

                super().run()

                # Remove pid file
                try:
                    os.remove(BASE_DIR / f"pid/{instance_name}.pid")
                except:  # noqa
                    pass

        TFSApp(app).run()


if __name__ == "__main__":
    main()
