#!python
from pprint import pprint  # noqa: F401

import click
from p10s.__version__ import __version__
from p10s.generator import Generator
from p10s.watcher import Watcher


class AliasedGroup(click.Group):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.alias_mapping = {}

    def add_mapping(self, frm, to):
        self.alias_mapping[frm] = to

    def get_command(self, ctx, cmd_name):
        rv = click.Group.get_command(self, ctx, cmd_name)
        if rv is not None:
            return rv

        if cmd_name in self.alias_mapping:
            return click.Group.get_command(self, ctx, self.alias_mapping[cmd_name])

        matches = [x for x in self.list_commands(ctx) if x.startswith(cmd_name)]
        if not matches:
            return None
        elif len(matches) == 1:
            return click.Group.get_command(self, ctx, matches[0])
        ctx.fail("Too many matches: %s" % ", ".join(sorted(matches)))


@click.group(cls=AliasedGroup)
@click.version_option(__version__)
def cli():
    pass


def _generate(filename, verbose):
    if len(filename) == 0:
        filename = ["."]
    for f in filename:
        Generator().generate(f, verbose=verbose)


@cli.command()
@click.argument("filename", nargs=-1)
@click.option("-v", "--verbose", type=bool, default=False, is_flag=True)
def generate(filename, verbose):
    _generate(filename, verbose)


@cli.command()
@click.option("--ignore-dotfiles", type=bool, default=True)
@click.option("-v", "--verbose", type=bool, default=False, is_flag=True)
@click.argument("directory", nargs=1, default=".")
def watch(directory, ignore_dotfiles, verbose):
    watcher = Watcher(directory, ignore_dotfiles)
    watcher.install_signal_handlers()
    watcher.watch(verbose=bool(verbose))


@cli.command()
def version():
    print("p10s, v%s" % __version__)


if __name__ == "__main__":
    cli()
