#!/usr/bin/env python2
# coding=utf8
import os
import argparse
import json
import iniparse
# local imports
import templet


def parse_args():
    parser = argparse.ArgumentParser(description='Templet')
    parser.add_argument('name', nargs=1, help='Project name')
    parser.add_argument('-t', '--template', nargs=1, metavar='template',
                                 help='Name of predifind template or full path to template folder')
    parser.add_argument('-v', '--vars', nargs=1, metavar='vars',
                                 help='Project variables')
    parser.add_argument('-V', '--vars-from-file', nargs=1, metavar='path',
                                 help='Read project variables from json file')
    return (vars(parser.parse_args()), parser)

def parse_vars_from_cli(vars):
    """Parse project variables defined in format 'var=value'
    :arg: vars - str
    :return: dict"""

    res = {}
    separate_vars = vars.split(',')
    for var in separate_vars:
        key, val = var.split('=')
        res[key] = val
    return res

def parse_vars_from_file(path):
    if os.path.exists(path):
        with open(path) as fp:
            return json.load(fp)
    return {}

def get_project_template_path(template):
    if os.path.exists(template):
        return template
    cfg_path = os.path.expandvars('$HOME/.config/templet/config.ini')
    if os.path.exists(cfg_path):
        with open(cfg_path) as fp:
            cfg = iniparse.INIConfig(fp)
        if isinstance(cfg.template, iniparse.config.Undefined):
            return
        full_template_path = getattr(cfg.template, template)
        if full_template_path:
            return full_template_path

def main():
    args, parser = parse_args()
    template = 'default'
    if args['template']:
        template = args['template'][0]

    vars = {}
    if args['vars']:
        try:
            vars = parse_vars_from_cli(args['vars'][0])
        except ValueError:
            print('--vars argument is wrong, skipping variables from cli')
    if args['vars_from_file']:
        vars.update(parse_vars_from_file(args['vars_from_file'][0]))
    vars['PROJECT_NAME'] = args['name'][0]

    project_template_path = get_project_template_path(template)
    project_root = os.path.join(os.path.abspath(os.getcwd()), vars['PROJECT_NAME'])

    templet.handle_project(project_template_path, project_root, vars)

if __name__ == "__main__":
    main()

