#!/usr/bin/env python3

import argparse
import inspect
import logging
import os.path
import subprocess
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('.')
    elif args.recipe == 'install':
        assert len(args.param), 'URL not found'
        url = args.param[0]
        print('Installing recipe into /opt/alpharecipes/ from {}'.format(url))
        subprocess.call('cd /opt/alpharecipes/ && git clone {}'.format(url), shell=True)
        return
    elif args.recipe == 'update':
        assert len(args.param), 'Recipe name not found'
        recipe_path = os.path.join('/opt/alpharecipes', args.param[0])
        if not os.path.exists(recipe_path):
            print('Path doesn\'t exists: {}'.format(recipe_path))
            return
        print('Updating recipe /opt/alpharecipes/{}'.format(recipe_path))
        subprocess.call('cd {} && git pull origin master'.format(recipe_path), shell=True)
        return
    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) as e:
        sys.exit(e.message)
