#!/usr/bin/env python

import argparse
import inspect
import logging
import sys

from alpha.recipe import Recipes
from alpha.abstract import Recipe

def run_action(args):
    if '.' in args.recipe:
        recipe_name, action_name = args.recipe.split('.')
    else:
        recipe_name = args.recipe
        action_name = ''

    recipes = Recipes()
    recipe = recipes.get(recipe_name)
    if not recipe:
        for recipe, recipe_doc in recipes.all():
            print '{}:\n  {}'.format(recipe, recipe_doc and recipe_doc.strip())
        raise ValueError('Recipe doesn\'t exists: {}'.format(recipe_name))

    action = getattr(recipe, action_name, None)
    if action_name and action:
        action(*args.param)
    else:
        required_action = action
        required_action_name = action_name
        for action_name in dir(recipe):
            action = getattr(recipe, action_name)
            if inspect.ismethod(action) and issubclass(action.__self__.__class__, Recipe) or \
            inspect.isfunction(action):
                print '{}:\n  {}'.format(action_name, action.__doc__ and action.__doc__.strip())
        if not required_action and required_action_name:
            raise ValueError('Action doesn\'t exists: {}'.format(required_action_name))


if __name__ == '__main__':

    parser = argparse.ArgumentParser()
    parser.add_argument('recipe')
    parser.add_argument('param', nargs='*')
    parser.add_argument('-v', '--verbose', action='store_true')

    args = parser.parse_args()
    if args.verbose:
        logging.basicConfig(level=logging.DEBUG)
    else:
        logging.basicConfig(level=logging.INFO)

    try:
        run_action(args)
    except (ValueError, RuntimeError), e:
        sys.exit(e.message)
