#!/usr/bin/python3
"""
@file
@ingroup refPyProg
@copyright ESO - European Southern Observatory
@author Mono Blanco <mono@example.com>

@brief refPyProg `main` source file

The getTemplate...
"""
from cookiecutter.main import cookiecutter

def main():
    """
    @brief Entry point of refPyProg

    A hello world example.

    @ingroup refPyProg
    """
    import argparse
    import os.path
    
    parser = argparse.ArgumentParser(description="getTemplate tool")
    parser.add_argument("output", help="directory name, module name or file name")
    group = parser.add_mutually_exclusive_group(required=True)
    group.add_argument("-d", dest='dir',  help="generate directory from template", choices=['introot', 'sysroot','dataroot','module'])
    group.add_argument("-f", dest='file', help="genetate file from template", choices=['c++-main', 'c++-class', 'c++-h','py','wscript'])
   
    # Create project from the cookiecutter-pypackage/ template
    #cookiecutter('cookiecutter-pypackage/')
    args = parser.parse_args()

    dirname=os.path.dirname(os.path.abspath(args.output))
    #print (dirname)

    # Check if output dir writable
    if not os.path.exists(dirname):
       try:
          os.makedirs(dirname)
       except:
          raise OSError("Can't create destination directory (%s)!" % (dirname)) 

    if not os.access(dirname, os.W_OK):
       print (">>>> ERROR: output directory {} not writable".format(dirname))
       return False
    
    if args.dir in ('introot', 'sysroot'):
       print(args.dir)
       basename=os.path.basename(args.output)
       #the template path is already define in config file used
       cookiecutter('rootdir',output_dir=dirname, 
                     no_input=True,
                     extra_context={'rootdir_type':args.dir,
                                    'rootdir_name':basename})
       print(">>>> Directory {} created".format(args.output))

    # TODO : make required/mandatory the output file or dir
    # Handling of error from cookiecutter? or force always.. 
    # Check if exist and report error force option

    if args.dir == 'dataroot':
       print(args.dir)
       basename=os.path.basename(args.output)
       #the template path is already define in config file used
       cookiecutter('dataroot',output_dir=dirname, 
                     no_input=True,
                     extra_context={'rootdir_name':basename})
       print(">>>> Directory {} created".format(args.output))

    if args.dir == 'module':
       modname=os.path.basename(args.output)
       cookiecutter('module', output_dir=dirname,
                     extra_context={'module_name':modname,'pkg_name':modname})
       print(">>>> Module {} created".format(args.output))

    if args.file:
       filename= os.path.basename(args.output)
       #
       print(args.file)
       #the template path is already define in config file used
       if args.file in ('c++-class','c++-h'):
           cookiecutter('file',output_dir=dirname,
                         no_input=True,
                         extra_context={'class_name':filename, 'filetype':args.file})
       if args.file == 'c++-main':
           cookiecutter('file',output_dir=dirname,
                         no_input=True,
                         extra_context={'main_name':filename,'filetype':args.file})
       if args.file == 'py':
           cookiecutter('file',output_dir=dirname,
                         no_input=True,
                         extra_context={'module_name':filename,'filetype':args.file})
       if args.file == 'wscript':
       # TODO the filename will always be wscript, check the output name 
           cookiecutter('file',output_dir=dirname,
                         no_input=True,
                         extra_context={'filetype':args.file})

       print(">>>> file {} created".format(args.output))


if __name__ == "__main__":
    main()
