#!/usr/bin/python3
'''
This script used to generate __manifest__ depends for project core install
'''

import sys
import json
import os
from importlib import import_module
from functools import reduce

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

OPTIONS = '''
Options:
    - project (project=biszx) *required
    - website (website=https://biszx.com)
        default: 
    - version (version=14)
        default: 14
    - addon_path (addon_path=addons)
        default: addon
'''

def get_argv():
    '''
    Make bash arguments into dict
    '''
    argv_dict = {
        'addon_path': 'addons',
        'website': '',
        'version': '14'
    }
    for arg in sys.argv[1:]:
        pare = arg.split('=')
        key = pare[0]
        value = pare[1]
        argv_dict[key] = value
    return argv_dict


def validate_argv(argv):
    required_argv = ['project']
    return reduce(lambda a, v: a and v in argv, required_argv, True)


def get_depends(argv):
    ext = argv.get('ext', {})
    addon_paths = [argv['addon_path']] + ext.get('addon_path', [])
    dirs = []
    for addon_path in addon_paths:
        dirs += list(filter(
            lambda v: (
                os.path.isdir(os.path.join(addon_path, v))
                and v != '%s_core_install' % argv['project'].lower()
            ),
            os.listdir(addon_path)
        ))
    dirs += ext.get('depends', [])
    dirs.sort()
    return json.dumps(
        dirs,
        indent=8
    ).replace('"', '\'')[:-1] + '    ]'


def generate_manifest(argv, manifest_path):
    with open(manifest_path, 'w') as f:
        option = (
            '    \'name\': \'{project} Core Install\',\n'
            '    \'summary\': \'{project} Core Install\',\n'
            '    \'author\': \'{project}\',\n'
            '    \'website\': \'{website}\',\n'
            '    \'version\': \'{version}.0.0.0.1\',\n'
            '    \'depends\': {depends}'
        ).format(project=argv['project'].upper(),
                 website=argv['website'],
                 version=argv['version'],
                 depends=get_depends(argv))
        f.write('{\n%s\n}\n' % option)


def main():
    argv = get_argv()
    if validate_argv(argv):
        core_install_path = os.path.join(
            argv['addon_path'],
            '%s_core_install' % argv['project']
        )
        init_path = '%s/__init__.py' % core_install_path
        manifest_path = '%s/__manifest__.py' % core_install_path
        ext_path = '%s/ext.py' % core_install_path
        out = False
        if not os.path.exists(core_install_path):
            os.makedirs(core_install_path)
            out = True
        if not os.path.exists(init_path):
            with open(init_path, 'w') as f:
                f.write('')
            out = True

        has_ext = os.path.exists(ext_path)
        if has_ext:
            argv['ext'] = import_module(
                ext_path.split('.')[0].replace('/', '.')
            ).options
        generate_manifest(argv, manifest_path)
        if out:
            exit(1)
    else:
        raise Exception('Some options is missing' + OPTIONS)


if __name__ == '__main__':
    main()
