"""Module containing some of the logic for our VCS installation logic."""
from flake8 import exceptions as exc
from flake8.main import git
from flake8.main import mercurial


# NOTE(sigmavirus24): In the future, we may allow for VCS hooks to be defined
# as plugins, e.g., adding a flake8.vcs entry-point. In that case, this
# dictionary should disappear, and this module might contain more code for
# managing those bits (in conjuntion with flake8.plugins.manager).
_INSTALLERS = {"git": git.install, "mercurial": mercurial.install}


def install(option, option_string, value, parser):
    """Determine which version control hook to install.

    For more information about the callback signature, see:
    https://docs.python.org/3/library/optparse.html#optparse-option-callbacks
    """
    installer = _INSTALLERS.get(value)
    errored = False
    successful = False
    try:
        successful = installer()
    except exc.HookInstallationError as hook_error:
        print(str(hook_error))
        errored = True

    if not successful:
        print("Could not find the {0} directory".format(value))
    raise SystemExit(not successful and errored)


def choices():
    """Return the list of VCS choices."""
    return list(_INSTALLERS)
