"""
Génération de QCM sous LaTeX
Auteur: Stéphane Pasquet
Date: 2023/09/07
Version: 1.02
URL: https://www.mathweb.fr/euclide/generer-un-qcm-a-laide-de-python-et-latex/
Syntaxe: qcm(file,colonnes(optionnel), solution=True|False (optionnel), colorcheck = '...', remove = True|False)
    * file: chemin du fichier texte
    * colonnes: nombre de colonnes sur lesquelles répartir les réponses (par défaut: 1 colonne, donc 1 réponse par ligne)
    * solution = booléen (True|False). True = affiche les réponses correctes
    * colocheck = couleur de la coche quand les réponses correctes sont affichées. Par défaut, colorcheck = 'red'
    * clean = True|False (supprime les fichiers auxiliaires) [version 1.01]. Par défaut = True
    * read = True(par défaut)|False. Lance le PDF automatiquement.
Dans le fichier texte:
    * -NEWPAGE- pour sauter une page (à insérer uniquement juste avant une question)
    ---> Attention "-NEWPAGE-" doit être écrit sans espaces, ni avant, ni après
    * 'T-' pour introduire le titre
    * 'N-' pour introduire le niveau
    * 'C-' pour introduire la consigne
    * 'Q-' pour introduire la question
    * 'R-' pour introduire les réponses possibles
    * 'I-' pour introduire une information complémentaire (dans le fichier solution) après la question [version 1.02]
"""
from os import remove
import os.path

def qcm(file , colonnes = 1 , solution = False , colorcheck = 'red', clean = True, read = True):
    with open(file, 'r' , encoding='utf8') as qcm:
        Q = qcm.read().split('\n')

    titre = False
    niveau = False
    consigne = False
    question = False
    reponse = False
    newpage = False
    nq = 0
    
    with open('preambule.tex', 'r' , encoding='utf8') as fileTEX:
        latex = fileTEX.read()
    
    latex += '\n'
    
    for line in Q:
        match line:
            case '-NEWPAGE-':
                newpage = True
                if colonnes > 1:
                    if ( (solution == True) and (indication == False) ) or (solution == False) :
                        latex += '\\end{multicols}\n'
                latex += '\\end{enumerate} % fin des propositions de la question ' + str(nq) + '\n'
                latex += '\n\n\\newpage\n'
            case 'T-':
                titre = True
                latex += '\\title{'
            case 'N-':
                niveau = True
                latex += '\\author{'
            case 'C-':
                consigne = True
                if solution == True:
                    latex += '\\begin{consigne}{Réponses}\n'
                else:
                    latex += '\\begin{consigne}{Consigne}\n'
                consigne = True
            case 'DEBUT-':
                latex += '\\begin{enumerate}\n'
            case 'Q-':
                if nq > 0:
                    if newpage == False:
                        if colonnes > 1:
                            if (indication == False and solution == True) or (solution == False):
                                latex += '\\end{multicols}\n'
                        latex += '\\end{enumerate} % fin des propositions de la question ' + str(nq) + '\n\n\\bigskip\n\n'
                    else:
                        newpage = False
                    reponse = False
                latex += '\\item \\bgroup\\bfseries\\boldmath '
                question = True
                indication = False
                nq += 1
            case 'R-':
                latex += '\\begin{enumerate}\n'
                if colonnes > 1:
                    latex += '\\begin{multicols}{'+str(colonnes)+'}\n'
                reponse = True
            case 'I-':
                indication = True
                if solution == True:
                    if colonnes > 1:
                        latex += '\\end{multicols}\n'
            case 'FIN-':
                if colonnes > 1 and ( (indication == False and solution == True) or (solution == False) ):
                    latex += '\\end{multicols}\n'
                latex += '\\end{enumerate} % fin de la question ' + str(nq) + '\n'
                latex += '\\end{enumerate} % fin du qcm\n\\end{document}'
            case _:
                if titre == True:
                    latex += line + '}\n'
                    titre = False
                elif niveau == True:
                    latex += line + '}\n'
                    niveau = False
                    latex += '\\date{\\today}\n'
                    latex += '\\maketitle\n\\thispagestyle{fancy}\n'
                elif consigne == True:
                    if solution == False:
                        latex += line+'\n\\end{consigne}\n % fin de la consigne\n'
                    else:
                        latex += 'Vous trouverez ci-dessous les réponses correctes.\n\\end{consigne}\n'
                    consigne = False
                elif question == True:
                    latex += line + '\\egroup\n'
                    question = False
                elif reponse == True:
                    if line != '':
                        if indication == False:
                            P = line.split('|')
                            if int(P[1]) == 1 and solution == True:
                                latex += '\\item[\\checkbox{'+colorcheck+'}] '
                            else:
                                latex += '\\item[$\square$] '
                            latex += P[0] + '\n'
                        elif solution == True:
                            latex += '\\begin{tcolorbox}[info]\n' + line + '\n\\end{tcolorbox}\n'
    
    if solution == True:
        ext = '-solution'
    else:
        ext = ''
        
    if os.path.exists(f'{file[:-4]}{ext}.tex'):
        os.remove(f'{file[:-4]}{ext}.tex')

    fichier = open(f'{file[:-4]}{ext}.tex' , "x" , encoding="utf8") # "x" pour la création et l'écriture
    fichier.write(latex)
    fichier.close()
    
    rep, fic = file.split('/')[0], file.split('/')[1]
    os.chdir(rep) # on se met dans le répertoire
    instructions = f'pdflatex "{fic[:-4]}{ext}.tex"'
    os.system(instructions)
    os.system(instructions)
    
    if clean == True:
        extensions = [ 'log', 'aux', 'out' ]
        for e in extensions:
            remove( f'{fic[:-4]}{ext}.{e}' )
    
    if read:
        readpdf = f'START {fic[:-4]}{ext}.pdf'
        os.system(readpdf)