"""Home Assistant command line scripts."""
import argparse
import importlib
import logging
import os
import sys

from typing import List

from homeassistant.bootstrap import mount_local_lib_path
from homeassistant.config import get_default_config_dir
from homeassistant.const import CONSTRAINT_FILE
from homeassistant.util.package import (
    install_package, running_under_virtualenv)


def run(args: List) -> int:
    """Run a script."""
    scripts = []
    path = os.path.dirname(__file__)
    for fil in os.listdir(path):
        if fil == '__pycache__':
            continue
        elif os.path.isdir(os.path.join(path, fil)):
            scripts.append(fil)
        elif fil != '__init__.py' and fil.endswith('.py'):
            scripts.append(fil[:-3])

    if not args:
        print('Please specify a script to run.')
        print('Available scripts:', ', '.join(scripts))
        return 1

    if args[0] not in scripts:
        print('Invalid script specified.')
        print('Available scripts:', ', '.join(scripts))
        return 1

    script = importlib.import_module('homeassistant.scripts.' + args[0])

    config_dir = extract_config_dir()
    deps_dir = mount_local_lib_path(config_dir)

    logging.basicConfig(stream=sys.stdout, level=logging.INFO)
    for req in getattr(script, 'REQUIREMENTS', []):
        if running_under_virtualenv():
            returncode = install_package(req, constraints=os.path.join(
                os.path.dirname(__file__), os.pardir, CONSTRAINT_FILE))
        else:
            returncode = install_package(
                req, target=deps_dir, constraints=os.path.join(
                    os.path.dirname(__file__), os.pardir, CONSTRAINT_FILE))
        if not returncode:
            print('Aborting script, could not install dependency', req)
            return 1

    return script.run(args[1:])  # type: ignore


def extract_config_dir(args=None) -> str:
    """Extract the config dir from the arguments or get the default."""
    parser = argparse.ArgumentParser(add_help=False)
    parser.add_argument('-c', '--config', default=None)
    args = parser.parse_known_args(args)[0]
    return (os.path.join(os.getcwd(), args.config) if args.config
            else get_default_config_dir())
