#!/usr/bin/env python2.7
# encoding: utf-8
# -*- coding: utf-8 -*-

import sys
import os
sys.path.append(os.getcwd())

import steroids 
import steroids.modules 
import argparse
import imp

parser = argparse.ArgumentParser(description="Build cool stuff reducing efforts and time.")
parser.add_argument('action', help="Action to perform", choices=["init","modules"])
parser.add_argument('name', help="Project name")

parser.add_argument('--modules', '-m', nargs="*", default=["flask","mongodb","bootstrap","honcho","gunicorn"], help="Modules to use")
parser.add_argument('--basepath', '-b', nargs=1, default=None, type=str, help="Path to use")
parser.add_argument('--examples', '-e', nargs=1, default=False, type=bool, help="Install examples?")
parser.add_argument('--version', "-v", action='version', version=steroids.__version__)

arguments = parser.parse_args()

### Init part ###
if arguments.action == "init":
    PROJECT_NAME = arguments.name
    
    if arguments.basepath:
        PROJECT_ABS_PATH = arguments.basepath[0]
    else:
        PROJECT_ABS_PATH = os.path.join(os.getcwd(),PROJECT_NAME)
    
    PROJECT_MODULES = list()
    
    sys.stderr.write("# Initializing %s\n" % PROJECT_NAME)
    if arguments.modules:
        modules_available = dir(steroids.modules)
        for module in arguments.modules:
            if module in modules_available:
                PROJECT_MODULES.append(module)
            else:
                sys.stderr.write("\n**W: 404 module not found: %s**\n" % module)
                
                
    if len(PROJECT_MODULES) == 0:
        raise Exception("Using 0 modules!")
    
    ## Steroids is useful not only for web projects:
    #if not "flask" in PROJECT_MODULES:
    #    sys.stderr.write("\nW: Flask module not selected: added\n")
    #    PROJECT_MODULES.insert(0, "flask")
    
    from steroids.installation import *
    
    if not os.path.exists(PROJECT_ABS_PATH):
        os.mkdir(PROJECT_ABS_PATH)
    else:
        raise Exception("Directory already exists: %s" % PROJECT_ABS_PATH)
        
    sys.stderr.write("## Installing Modules:\n")
    
    all_requirementes = list()
    for module_name in PROJECT_MODULES:
        module = __import__("steroids.modules.%s" % module_name, globals(), locals(), [module_name], -1)
        sys.stderr.write(" - Installing %s\n" % module_name)
        install_module(module, PROJECT_ABS_PATH, PROJECT_NAME, examples=arguments.examples)
        all_requirementes = all_requirementes + list(set(module.requirements) - set(all_requirementes))
    
    sys.stderr.write("## Creating requirements... \n")
    requirements_file = open(os.path.join(PROJECT_ABS_PATH,"requirements.txt"), "w")
    requirements_file.write("\n".join(all_requirementes))
    requirements_file.close()
    sys.stderr.write("# %s initialized correctly!\nHave nice coding :)\n" % PROJECT_NAME) 

### Modules part ### 
elif arguments.action == "modules":
    if arguments.name == "list":
        sys.stderr.write("# Steroids modules available: \n")
        for module_name in dir(steroids.modules):
            if module_name[0] == "_": continue
            sys.stderr.write(" - %s\n" % module_name)
        sys.stderr.write("\n")
        sys.stderr.write("Use -m option to use what you need\n")
        sys.stderr.write("By default Steroids uses flask, mongodb, bootstrap, gunicorn and honcho modules\n")
        
    elif arguments.name in dir(steroids.modules):
        module_name = arguments.name
        module = __import__("steroids.modules.%s" % module_name, globals(), locals(), [module_name], -1)
        sys.stderr.write("# Steroid module %s description:\n" % module_name)
        sys.stderr.write("\n")
        sys.stderr.write(module.__help__)
        sys.stderr.write("\n")
        sys.stderr.write("\n")
        sys.stderr.write("# How to use %s\n" % module_name)
        sys.stderr.write("Use this command to use this module: \n")
        sys.stderr.write("    steroids init ProjectName -m %s ...\n" % module_name)
        
        
    
    