#!/usr/bin/env python

from __future__ import with_statement

from fabric.api import env
from fabric.exceptions import NetworkError
import os
import sys

from chef_solo_cup import helpers
from chef_solo_cup.log import setup_custom_logger
from chef_solo_cup.parse_args import parse_args
from chef_solo_cup.version import version
from chef_solo_cup.commands.bootstrap import bootstrap
from chef_solo_cup.commands.clean import clean
from chef_solo_cup.commands.default import default
from chef_solo_cup.commands.gem import gem
from chef_solo_cup.commands.ruby import ruby
from chef_solo_cup.commands.runner import run_command, sudo_command
from chef_solo_cup.commands.sync import sync
from chef_solo_cup.commands.test import test
from chef_solo_cup.commands.update import update

AWS_KEY = os.environ.get('AWS_KEY', None)
AWS_SECRET_KEY = os.environ.get('AWS_SECRET_KEY', None)


args = parse_args()
version(args)

logger = setup_custom_logger('chef-solo-cup', args)
hosts = helpers.get_hosts(args, logger=logger)

commands = {
    'default': default,
    'clean': clean,
    'gem': gem,
    'ruby': ruby,
    'run': run_command,
    'sudo': sudo_command,
    'sync': sync,
    'test': test,
    'update': update,
}

if args.dry_run:
    logger.info("Running in dry-run mode, commands will not be executed")

logger.info("Matched hosts: " + str(hosts.keys()))

if args.ip_address and len(hosts.keys()) > 1:
    sys.exit("You cannot specify --ip-address with more than 1 matching host")

for host, config in hosts.iteritems():
    logger.info("Running {0} against {1}".format(args.command, host))

    env.use_ssh_config = True
    env.user = args.user

    if args.ip_address:
        env.host = args.ip_address
        env.host_string = args.ip_address
    else:
        env.host = host
        env.host_string = host

    if args.key_filename:
        env.key_filename = [args.key_filename, ]

    try:
        if args.command == 'bootstrap':
            env.abort_on_prompts = True
            bootstrap(args, config, logger=logger)
            update(args, config, logger=logger)
        elif args.command in commands:
            commands[args.command](args, config, logger=logger)
    except NetworkError as e:
        logger.exception("There was a network error: {0}".format(e.message))
