import logging
import os
import sys
from argparse import ArgumentParser, Namespace

import construi.console as console

from .__version__ import __version__
from .config import Config, parse
from .errors import on_exception
from .target import RunContext, Target

try:
    from shlex import quote  # type: ignore
except ImportError:
    from pipes import quote


def main():
    # type: () -> None
    setup_logging()

    args = parse_args()

    try:
        config = parse(args.basedir, "construi.yml")

        if args.list_targets:
            list_targets(config)
            sys.exit(0)

        target = args.target or config.default

        os.environ["CONSTRUI_ARGS"] = " ".join([quote(a) for a in args.construi_args])

        Target(config.for_target(target)).invoke(RunContext(config, args.dry_run))
    except Exception as e:
        on_exception(e)
    else:
        console.info("\nBuild Succeeded.\n")


def setup_logging():
    # type: () -> None
    root_logger = logging.getLogger()
    root_logger.addHandler(logging.StreamHandler(sys.stdout))
    root_logger.setLevel(logging.INFO)

    logging.getLogger("requests").propagate = False


def parse_args():
    # type: () -> Namespace
    parser = ArgumentParser(prog="construi", description="Run construi")

    parser.add_argument("--basedir", metavar="DIR", default=os.getcwd())
    parser.add_argument("-n", "--dry-run", action="store_true")
    parser.add_argument("-T", "--list-targets", action="store_true")
    parser.add_argument("-v", "--version", action="version", version=__version__)

    parser.add_argument("target", metavar="TARGET", nargs="?")
    parser.add_argument("construi_args", metavar="CONSTRUI_ARGS", nargs="*")

    return parser.parse_args()


def list_targets(config):
    # type: (Config) -> None
    targets = config.targets.keys() if config.targets else []

    for target in sorted(targets):
        print (target)