from flask import Flask
from flask_pymongo import PyMongo

from config.gitUtils import GitUtils

app = Flask(__name__)
app.config["MONGO_URI"] = "mongodb://localhost:27017/squelette"
mongo = PyMongo(app)


## Fonctions 'générales', principalement de manipulation des fichiers
class Utils:
    ## Fonction permettant de changer la version
    # @param idContenu l'id du contenu associé
    # @param version la version désirée du contenu
    # @param nomBranche le nom de la branche désirée du contenu

    def changer_version(self, idContenu, version, nomBranche=""):
        from modele.contenu_dao import ContenuDao
        # on recupere le chemin du fichier associé au contenu (dans les 2 cas)
        chemin = ContenuDao().get_chemin_du_contenu(idContenu)
        repertoire = chemin[:chemin.rfind("/") + 1]

        if version != 0:
            # on change le repertoire récupéré ci dessus dans la bonne version (si on travaille avec une version)
            idCommit = ContenuDao().get_commit_pour_une_version(idContenu, version)
            GitUtils().changerVersionCommit(repertoire, idCommit)
        else:
            GitUtils().changerVersionBranche(repertoire, nomBranche)

    ## Fonction permettant de lire et de récupérer l'intérieur d'un fichier
    # @param id_contenu l'id du contenu désiré
    # @param en_cours permet de déterminer si le contenu que l'on désire est lié à un fichier en cours ou pas
    # @return l'intérieur du texte associé au contenu
    def recuperer_contenu_fichier(self, id_contenu, en_cours=False):
        from modele.contenu_dao import ContenuDao
        from modele.encours_dao import EncoursDao

        if (en_cours):
            chemin = EncoursDao().get_chemin_contenu_en_cours(id_contenu)
        else:

            chemin = ContenuDao().get_chemin_du_contenu(id_contenu)
        with open(chemin, "r") as fichier:
            texte = fichier.read()

        return texte.strip()

    ## Fonction permettant de lire et de récupérer l'intérieur d'un fichier (dans une version spécifique
    # @param id_contenu l'id du contenu désiré
    # @param version le numéro de version désiré
    # @return l'intérieur du texte associé au contenu
    def recuperer_contenu_version_fichier(self, id_contenu, version):
        from modele.contenu_dao import ContenuDao

        chemin = ContenuDao().get_chemin_du_contenu(id_contenu)
        commit = ContenuDao().get_commit_pour_une_version(id_contenu, version)
        repertoire = chemin[:chemin.rfind("/")]

        GitUtils().changerVersionCommit(repertoire, commit)

        with open(chemin, "r") as fichier:
            texte = fichier.read()

        return texte.strip()

    ## Fonction qui permet de mettre à jour l'intérieur du texte d'un contenu
    # @param id_contenu l'id du contenu qui verra son texte changé
    # @param nouveau_texte la maj du texte
    # @param majContenu si true, maj d'un contenu perso. Si false, maj d'un contenu en cours
    def changer_texte_fichier(self, id_contenu, nouveau_texte, maj_contenu=False):
        # On ouvre le contenu, soit pour mettre à jour une version de contenu perso,
        # soit pour changer le coeur d'un contenu en cours
        if maj_contenu:
            from modele.contenu_dao import ContenuDao
            chemin_fichier = ContenuDao().get_chemin_du_contenu(id_contenu)
        else:
            from modele.encours_dao import EncoursDao
            chemin_fichier = EncoursDao().get_chemin_contenu_en_cours(id_contenu)
        myFile = open(chemin_fichier, "w")
        # y ajouter le texte du contenu
        myFile.write(nouveau_texte)
        myFile.close()