#!/usr/bin/env python
# -*- coding: utf-8 -*-

from __future__ import print_function

import re
from dax import spiders


SPIDER_TEMPLATE = '''# This file generated by GenerateAutoSpider
from dax import AutoSpider

name = '{name}'

version = '{version}'

exe_lang = '{exe_lang}'

inputs = {inputs}

outputs = {outputs}

code = r"""{code}"""

if __name__ == '__main__':
    spider = AutoSpider(
        name,
        inputs,
        outputs,
        code,
        version=version,
        exe_lang=exe_lang,
    )

    spider.go()
'''


def parse_args():
    """
    Method to parse arguments base on ArgumentParser
    :return: parser object parsed
    """
    from argparse import ArgumentParser
    usage = "Generate your Spider .py following the dax template for spider"
    parser = ArgumentParser(prog='GenerateAutoSpider', description=usage)
    parser.add_argument('-n', dest='name', required=True,
                        help='Name for Spider. e.g. fMRIQA')
    parser.add_argument('-v', dest='version', required=True,
                        help='Spider version, format: X.Y.Z, e.g. 1.0.0')
    parser.add_argument('-i', dest='inputs_file', help='Path to inputs file',
                        required=True)
    parser.add_argument('-o', dest='outputs_file', help='Path to outputs file',
                        required=True)
    parser.add_argument('-c', dest='code_file', required=True,
                        help='Path to code template file')
    parser.add_argument('-d', dest='directory', default=None,
                        help="Directory where spider file will be written")
    return parser.parse_args()


def get_exe_language(code_file):
    """Return the exe language that will be use to run the code_str."""
    extension = code_file.split('.')[-1]
    if extension == 'py':
        return 'python'
    elif extension == 'm':
        return 'matlab'
    elif extension == 'sh':
        return 'bash'
    elif extension == 'rb':
        return 'ruby'
    else:
        print("Warning: file %s don't have any known extension \
(.py/.m/.sh/.rb)" % code_file)
        return None


if __name__ == '__main__':
    print('Deprecated executable. Use dax_generator autospider instead.')
    ARGS = parse_args()
    inputs_file = ARGS.inputs_file
    outputs_file = ARGS.outputs_file
    code_file = ARGS.code_file

    # TODO: error-checking on the files

    # Check spider name
    if ARGS.name.endswith('.py') or "spider" in ARGS.name.lower() or \
       not re.compile('^\w+$').match(ARGS.name):
        err = "Invalid spider name"
        raise ValueError(err)

    # Check version
    if not spiders.is_good_version(ARGS.version):
        err = "Invalid format for version. \
Must be X.Y.Z. See http://semver.org."
        raise ValueError(err)

    # Load Inputs
    inputs = spiders.load_inputs(inputs_file)
    inputs_str = '['
    for i in inputs:
        inputs_str += '\n    ("'
        inputs_str += '", "'.join(i)
        inputs_str += '"),'

    inputs_str = inputs_str[:-1] + ']'

    # Load Outputs
    outputs = spiders.load_outputs(outputs_file)
    outputs_str = '['
    for i in outputs:
        outputs_str += '\n    ("'
        outputs_str += '", "'.join(i)
        outputs_str += '"),'

    outputs_str = outputs_str[:-1] + '\n]'

    # Get executable language:
    exe_lang = get_exe_language(code_file)

    # Load the code template
    code_str = spiders.load_template(code_file)
    code_str = code_str.replace('"""', "'''")

    # Make the spider
    spider_file = 'Spider_{}_v{}.py'.format(ARGS.name,
                                            ARGS.version.replace('.', '_'))
    spider_str = SPIDER_TEMPLATE.format(
        name=ARGS.name,
        inputs=inputs_str,
        outputs=outputs_str,
        code=code_str,
        version=ARGS.version,
        exe_lang=exe_lang)

    # Write the file
    with open(spider_file, 'w') as f:
        f.write(spider_str)
