#!/usr/bin/env python

from __future__ import absolute_import
from __future__ import print_function

import argparse
import os
import sys
import pip

def provision_bot(path_to_bot, force):
    # type: (str, bool) -> None
    req_path = os.path.join(path_to_bot, 'requirements.txt')
    install_path = os.path.join(path_to_bot, 'bot_dependencies')
    if os.path.isfile(req_path):
        print('Installing dependencies...')
        if not os.path.isdir(install_path):
            os.makedirs(install_path)
        # pip install -r $BASEDIR/requirements.txt -t $BASEDIR/bot_dependencies --quiet
        rcode = pip.main(['install', '-r', req_path, '-t', install_path, '--quiet'])
        if not rcode == 0:
            print('Error. Check output of `pip install` above for details.')
            if not force:
                print('Use --force to try running anyway.')
                sys.exit(rcode)  # Use pip's exit code
        else:
            print('Installed.')
        sys.path.insert(0, install_path)

def dir_join(dir1, dir2):
    # type: (str, str) -> str
    return os.path.abspath(os.path.join(dir1, dir2))

def run():
    # type: () -> None
    usage = '''
        Installs dependencies of bots in api/bots directory. Add a
        reuirements.txt file in a bot's folder before provisioning.

        To provision all bots, use:
        ./provision.py

        To provision specific bots, use:
        ./provision.py [names of bots]
        Example: ./provision.py helloworld xkcd wikipedia

        '''

    bots_dir = dir_join(os.path.dirname(os.path.abspath(__file__)), 'bots')
    available_bots = [b for b in os.listdir(bots_dir) if os.path.isdir(dir_join(bots_dir, b))]

    parser = argparse.ArgumentParser(usage=usage)
    parser.add_argument('bots_to_provision',
                        metavar='bots',
                        nargs='*',
                        default=available_bots,
                        help='specific bots to provision (default is all)')
    parser.add_argument('--force',
                        default=False,
                        action="store_true",
                        help='Continue installation despite pip errors.')
    options = parser.parse_args()
    for bot in options.bots_to_provision:
        provision_bot(os.path.join(dir_join(bots_dir, bot)), options.force)

if __name__ == '__main__':
    run()
