from invoke import task
from pathlib import Path
from prompt_toolkit import prompt
from prompt_toolkit.completion import WordCompleter
from prompt_toolkit.validation import Validator
from unidecode import unidecode
import jinja2
from pytex import texenv
import datetime
import locale

locale.setlocale(locale.LC_ALL, "fr_FR.UTF-8")

TRIBES = [
    {"name": "Terminale Technologique", "directory": "TST"},
    {"name": "Terminale Terminale spé sti2d", "directory": "TST_sti2d"},
    {"name": "Science numérique et technologique", "directory": "SNT"},
    {"name": "Enseignement scientifique", "directory": "EnsSci"},
]

AUTHOR = "Benjamin Bertrand"


def is_tribe(tribe):
    return tribe in [t["directory"] for t in TRIBES]


def get_sequences(tribe):
    p = Path(tribe)
    return [x for x in p.iterdir() if (x.is_dir() and x.name[0:2].isdigit())]


def get_tags(tribe=""):
    p = Path(tribe)
    tags = set()
    indexes = p.glob("**/index.rst")
    for index_p in indexes:
        with open(index_p, "r") as index:
            line = index.readline()
            while line:
                if line.startswith(":tags"):
                    tags.update(line[7:].replace("\n", "").split(", "))
                    break
                line = index.readline()
    return {t.lower() for t in tags}


def next_weekday(date, day=0):
    return date + datetime.timedelta(days=(day - date.weekday() + 7) % 7)


def sequence_prompt():
    sequence = {}
    print("Nouvelle séquence")

    sequence["author"] = prompt("Auteur: ", default=AUTHOR)

    sequence["date"] = datetime.date.today()

    tribes = WordCompleter([t["directory"] for t in TRIBES])
    sequence["tribe"] = prompt(
        "Classe: ", completer=tribes, validator=Validator.from_callable(is_tribe)
    )

    sequences = get_sequences(sequence["tribe"])
    print("Séquences trouvées:\n\t" + "\n\t".join(sorted([s.name for s in sequences])))
    sequence["num"] = len(sequences) + 1
    sequence["title"] = prompt(f"Nom de la séquence (n°{sequence['num']}): ")

    known_tags = get_tags()
    sequence["tags"] = prompt(
        "Tags (séparés par une virgule): ", completer=WordCompleter(known_tags)
    )

    sequence["summary"] = prompt("Résumé: ")
    return sequence


def import_skel(dest, datas, skel="sequence", skel_path="./tools/skeleton"):
    d = Path(dest)
    d.mkdir()

    p = Path(skel_path + "/" + skel)
    files = [t.name for t in p.iterdir()]

    template_loader = jinja2.FileSystemLoader(searchpath=p)
    template_env = jinja2.Environment(loader=template_loader)

    texenv.loader.loaders.append(template_loader)

    print("")
    for filename in files:
        if filename.endswith(".tex"):
            template = texenv.get_template(filename)
        else:
            template = template_env.get_template(filename)

        output_text = template.render(**datas)

        with open(d / filename, "w") as f:
            f.write(output_text)
        print(f"Importation de {filename} - OK")


@task
def sequence(c):
    sequence = sequence_prompt()

    dest = unidecode(
        ("{tribe}/{num:0>2}_{title}/".format(**sequence)).replace(" ", "_")
    )
    dest = Path(dest)

    seq_summary = """\
            Séquence: {num:0>2} {title} 
            Niveau: {tribe}
            Auteur: {author}
            Date: {date}
            Tags: {tags}
            Sommaire: {summary}
            Dossier: {dest}
            """.format(
        dest=dest, **sequence
    )
    print(seq_summary)

    validate = prompt("C'est ok? ")
    if validate.lower() in ["o", "y", ""]:
        sequence["title_under"] = "#" * len(sequence["title"])
        import_skel(dest, sequence, "sequence")
    else:
        print("Tant pis. Ya plus qu'à recommencer.")

