from pytest import fixture  # , raises
from pathlib import Path
from ruamel.yaml import YAML
from rougail import RougailConfig
from rougail.output_doc import RougailOutputDoc

from .custom import CustomOption


dico_dirs = Path('../rougail/tests/dictionaries')
test_ok = set()

excludes = set([
    '60_5family_dynamic_unknown_suffix',
    '60_5family_dynamic_variable_outside_sub_suffix',
])

for test in dico_dirs.iterdir():
    if (test / 'tiramisu').is_dir() and test.name not in excludes:
        test_ok.add(test)

test_ok = list(test_ok)
test_ok.sort()

# test_ok = [dico_dirs / '60_0family_dynamic_variable_suffix']


@fixture(scope="module", params=test_ok)
def test_dir(request):
    return request.param


def _test_dictionaries(test_dir, output, namespace):
    rougailconfig = RougailConfig.copy()
    rougailconfig['step.output'] = 'doc'
    rougailconfig['doc.output_format'] = output
    rougailconfig['functions_files'] = [str(dico_dirs.parent / 'eosfunc' / 'test.py')]
#    rougailconfig['tiramisu_cache'] = "cache.py"
    dirs = [str(test_dir / 'dictionaries' / 'rougail')]
    subfolder = test_dir / 'dictionaries' / 'rougail2'
    if subfolder.is_dir():
        dirs.append(str(subfolder))
    rougailconfig['main_dictionaries'] = dirs
    if namespace:
        rougailconfig['main_namespace'] = 'Rougail'
    else:
        rougailconfig['main_namespace'] = None
    extra_dictionaries = {}
    extras = list((test_dir / 'dictionaries').iterdir())
    extras.sort()
    for extra in extras:
        if extra.name in ['rougail', 'rougail2']:
            continue
        if extra.is_dir():
            extra_dictionaries[extra.name] = [str(extra)]
    if extra_dictionaries:
        rougailconfig['extra_dictionaries'] = extra_dictionaries
    rougailconfig['custom_types']['custom'] = CustomOption
    inventory = RougailOutputDoc(rougailconfig=rougailconfig)
    doc = inventory.formater.header()
    yaml = YAML()
    len_subdir = len(str(dico_dirs)) + 1
    if extra_dictionaries:
        all_dirs = [[rougailconfig['main_dictionaries']], rougailconfig['extra_dictionaries'].values()]
    else:
        all_dirs = [[rougailconfig['main_dictionaries']]]
    for r in all_dirs:
        for dirs in r:
            for d in dirs:
                for f in Path(d).iterdir():
                    if f.name.endswith('.yml') or f.name.endswith('.yaml'):
                        doc += inventory.formater.title(str(f)[len_subdir:].split('/', 1)[-1], 1)
                        with f.open(encoding="utf8") as file_fh:
                            objects = yaml.load(file_fh)
                        doc += inventory.formater.yaml(objects)
    doc += inventory.gen_doc()
    if namespace:
        name = 'base'
    else:
        name = 'no_namespace'
    doc_file = Path('tests') / 'docs' / name / (test_dir.name + {'github': '.md', 'asciidoc': '.adoc'}.get(output))
    with doc_file.open('w') as docfh:
        docfh.write(doc)


def test_dictionaries_github(test_dir):
    _test_dictionaries(test_dir, 'github', True)


def test_dictionaries_asciidoc(test_dir):
    _test_dictionaries(test_dir, 'asciidoc', True)


def test_dictionaries_github_no_namespace(test_dir):
    if (test_dir / 'force_namespace').is_file():
        return
    _test_dictionaries(test_dir, 'github', False)


def test_dictionaries_asciidoc_no_namespace(test_dir):
    if (test_dir / 'force_namespace').is_file():
        return
    _test_dictionaries(test_dir, 'asciidoc', False)