from datetime import date
from flask import Flask, render_template
from markdown2 import markdown_path
from os import walk
from os.path import join

app = Flask(__name__)
md_path = 'markdown'


@app.route('/')
def home():
    """
    Route principale du site.

    Pour le dynamisme du site, le changement de page est fait en javascript du cote client. Il s'agit donc de la seule
    route du site. Il faut cependant charger les evenements sur la page car il s'agit du seul element dynamique du site.
    On vient donc chercher les fichiers Markdown correspondant aux evenements et on les fournits a 'render_template' qui
    va generer la page finale.

    :return: La page 'index.html' avec les events
    """
    mds = load_markdown_files()
    return render_template('index.html', mds=mds)


def del_links(html):
    """
    Supprime les balises de liens (<a>) dans le code HTML.

    La fonction parcours l'ensemble du code caractère par caractère. Il commence par rechercher le debut de la balise
    ouvrante ('<a') puis la fin de celle-ci ('>'). S'il a trouve une balise ouvrante il cherche alors une balise
    fermante ('</a>'). Tout le texte du texte HTML reste intact mis à part la balise ouvrante et la balise fermante
    qui sont supprimees.

    :param html: Code HTML où les balises doivent etre supprimees.
    :return: Le code HTML initial mais sans balises de liens
    """
    new_html = ""
    i = 0
    opened = False
    while i < len(html) - 4:  # La recherche de la balise fermante ne doit pas entrainer une erreur
        if html[i:i + 3] == "<a ":  # Début de la balise ouvrante d'un lien
            for j in range(3, len(html) - i - 3):
                if html[i + j] == ">":  # Fin de la balise ouvrante
                    i += j + 1
                    break
            opened = True
        elif html[i:i + 4] == "</a>" and opened:  # Balise fermante
            i += 4
            opened = False
        else:
            new_html += html[i]
            i += 1
    return new_html


def load_markdown_files():
    """
    Charge les fichiers markdown correspondant aux evenements.

    La fonction parcour l'ensemble des fichiers dans le dossier 'md_path'. Elle commence par verifier que l'extention
    est correcte puis qu'il y a bien le bon nombre d'elements dans le nom du fichier (jour_mois_annee_titre.md). Elle
    va alors recuperer la date, le titre, l'article et generer une description a partir de ce dernier.

    :return: Liste de tuple contenant les informations necessaires des fichiers markdowns sous la forme :
             (date, titre, description, article)
    """
    mds = []
    for r, d, f in walk(md_path):
        for file in f:
            if file[-3:] == '.md':  # Il s'agit d'un fichier markdown
                split = file.split('_')
                if len(split) == 4:  # Son nom a le bon format : jour_mois_annee_titre.md

                    day, month, year, title = split
                    title = title[:-3]  # Retrait de l'extension
                    event_date = date(int(year), int(month), int(day))
                    article = markdown_path(join(md_path, file))
                    description = del_links(article)

                    mds.append((event_date, title, description, article))
    return mds


if __name__ == '__main__':
    app.run()
