#!/apollo/bin/env python

import argparse

import logging

import daisychain.log
from daisychain.executor import Executor
from daisychain.steps.compilers.chain import Chain
from daisychain.steps.inputs.file import InputFile
from daisychain.steps.inputs.system import StdIn
from daisychain.steps.pipes.json_convert import JsonLoad
from daisychain.instantiator import Instantiator

root_logger = logging.getLogger('')

def setup_logging(args):
    handler = logging.StreamHandler()
    handler.setFormatter(daisychain.log.DEFAULT_CONSOLE_FORMATTER)
    if args.verbose:
        root_logger = logging.getLogger('')
        root_logger.addHandler(handler)
        root_logger.setLevel('DEBUG')
    else:
        execution_logger = logging.getLogger('daisychain.steps')
        execution_logger.addHandler(handler)
        execution_logger.setLevel('DEBUG')


def main():
    parser = argparse.ArgumentParser(description="Run a plan")
    parser.add_argument('-c', '--config', help="JSON configuration file containing a 'steps' section or a __compilers__ section which results in a fully-specified 'steps' section.  If not specified, will read from stdin")
    parser.add_argument('-v', '--verbose', action='store_true', help="Set logger to 'DEBUG' level")
    parser.add_argument('--dry-run', action='store_true', help="Only run validation, not any of the 'run' methods for any steps")
    args = parser.parse_args()

    setup_logging(args)

    if args.config:
        input_file = InputFile(path=args.config)
    else:
        input_file = StdIn()
    json_load = JsonLoad(input_step=input_file)
    chain = Chain(input_step=json_load)
    compilation_executor = Executor(name='compilation', dependencies=[chain])
    compilation_executor.execute()

    instantiator = Instantiator(name='instantiation', config=chain.output['steps'])
    instantiator.run()

    plan_executor = Executor(name='steps', dependencies=instantiator.steps.values(), scan_interval=0.5, on_failure=Executor.PROMPT, dry_run=args.dry_run)
    plan_executor.execute()

if __name__ == '__main__':
    main()
