from random import *
from os import makedirs
from random import *

class Resultat:
    def __init__(self, plaquettes, objectif, calculs, solutions, minoration, majoration):
        self.plaquettes=plaquettes
        self.objectif=objectif
        self.calculs=calculs
        self.solutions=solutions
        self.minoration=minoration
        self.majoration=majoration
class Terme:
    def __init__(self, val, expr="", niv=0):
        self.val=val # valeur
        self.expr=expr if expr else str(val) # expression
        self.niv=niv # niveau de priorité pour l’opération à la racine
    def group(self):
        return Terme(self.val, "("+self.expr+")", self.niv)

class Operation:
    def __init__(self, sym, calc, niv, test=None): 
        self.sym=sym      # symbole de l’opération
        self.calc=calc    # fonction de calcul
        self.niv=niv      # niveau de priorité
        self.test=test    # test vérifiant la pertinence de l’opération
    def ev(self, a, b):   # fonction d’évaluation du terme résultat
        if self.test:
            if not self.test(a.val,b.val):
                if self.test(b.val,a.val):
                    a,b=b,a # renversement des opérandes
                else:
                    return None
        # adjonction de parenthèses au besoin
        if a.niv//2 > self.niv//2: 
            a=a.group()
        if 2*(b.niv//2) >= self.niv:
            b=b.group()
        return Terme(self.calc(a.val,b.val), a.expr+self.sym+b.expr, self.niv)
operations = [Operation("+", lambda a,b: a+b, 5),
    Operation("−", lambda a,b: a-b, 4, lambda a,b:a>b),
    Operation("×", lambda a,b:a*b, 3, lambda a,b:a>1 and b>1),
    Operation("/", lambda a,b:a//b, 2, lambda a,b: b>1 and a%b==0)]    


import pdfkit
config = pdfkit.configuration(wkhtmltopdf="C:\\Program Files\\wkhtmltopdf\\bin\\wkhtmltopdf.exe")
options = {
    'page-size': 'Letter',
    'margin-top': '0.75in',
    'margin-right': '0.75in',
    'margin-bottom': '0.75in',
    'margin-left': '0.75in',
    'encoding': "UTF-8",
    'quiet': ''
    }


def sauv_ex(n,chaine):
    """sauvegarde exercice n"""
    with open ("ennonces_html/exercice"+str(n)+".html", "w",encoding='utf-8') as f:
        f.write(chaine)

def sauv_corr(n,chaine):
    """sauvegarde correction n"""
    with open ("corriges_html/exercice"+str(n)+".html", "w",encoding='utf-8') as f:
        f.write(chaine)

def resolution3(plaquettes, objectif):
    L=[([Terme(k) for k in sorted(plaquettes, reverse=True)],0)]
    N=1
    n=0
    solutions=[]
    c=0
    minoration = Terme(max(plaquettes))
    majoration = None
    while(n<N):
        P,debut=L[n]
        for j in range(debut,len(P)):
            for f in operations:
                if P[j].niv//2 != f.niv//2 or P[j].niv > f.niv:
                    for i in range(j):
                        if P[i].niv//2 != f.niv//2 or P[i].niv%2:
                            t=f.ev(P[i],P[j])
                            if t:
                                c+=1
                                if t.val==objectif:
                                    solutions.append(t.expr)
                                else:
                                    Q=[(t if k==j else P[k])
                                        for k in range(len(P)) if k!=i]
                                    L.append((Q,j-1))
                                    N+=1
                                    if t.val < objectif:
                                        if minoration.val < t.val:
                                            minoration = t
                                    elif not majoration or majoration.val > t.val:
                                            majoration = t
        n+=1
    return Resultat(plaquettes, objectif, c, list(set(solutions)), minoration, majoration)




   
def exercice1():
     with open("lceb.svg", "r", encoding='utf-8') as f:
         svg=f.read()
     htm="""<h2 style="font-size:120%; color:red;">Jeu 1 :</h2><div style="margin-left:100px;font-size:16px">"""
     les_plaques=[1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,25,25,50,50,75,75,100,100]
     fini=False
     while not fini:
           shuffle(les_plaques)
           pl=les_plaques[:6]
           objectif=randint(100,999)
           a=resolution3(pl,objectif)
           fini=len(a.solutions)>0 and  len(a.solutions)<8
     htm+=svg.format(*pl,objectif)
  
     htm+="</div>"



     corr=htm
     corr+="""<h2> Mes solutions : </h2>""" 
     corr+="<ul>"
     for i in a.solutions:
         corr+="<li> {} = {} </li>".format(objectif,i)
     corr+="</ul></div>"
     return htm,corr

def exercice2():
    with open("mot.svg", "r", encoding='utf-8') as f:
         svg=f.read()
    htm="""<h2 style="font-size:120%; color:red;">Jeu 2:</h2><div style="margin-left:100px;font-size:16px">"""
    les_mots={"cosinus" :"""Dans un triangle rectangle, le <a href="https://site2wouf.fr/trigonometrie.php">cosinus</a> d'un angle est le rapport de la longueur du côté adjacent par la longueur de l'hypoténuse.""",
               "sinus" :"""Dans un triangle rectangle, le <a href="https://site2wouf.fr/trigonometrie.php">sinus</a> d'un angle est le rapport de la longueur du côté opposé par la longueur de l'hypoténuse.""" ,
               "thales":"""Le <a href="https://site2wouf.fr/thales_3eme.php">théorème de Thalès</a> est étudié au cycle 4.""" ,
               "pythagore":"""Le <a href="https://site2wouf.fr/pythagore.php">théorème de Pythagore</a> est étudié au cycle 4."""  ,
               "tangente" :"""Dans un triangle rectangle, la <a href="https://site2wouf.fr/trigonometrie.php">tangente</a>  d'un angle est le rapport de la longueur du côté opposé par la longueur du côté adjacent.""", 
               "médiatrice":"""On appelle <a href="https://site2wouf.fr/mediatrice.php">médiatrice d'un segment</a> la droite perpendiculaire à ce segment en son milieu.""",
               "trigonométrie":"""<a href="https://site2wouf.fr/trigonometrie.php">La trigonométrie</a>  (du grec τρίγωνος / trígonos, « triangulaire », et μέτρον / métron, « mesure ») est une branche des mathématiques qui traite des relations entre distances et angles dans les triangles et des fonctions trigonométriques telles que sinus, cosinus, tangente. """ ,
               "perpendiculaire":"""<a href="https://site2wouf.fr/paraperp.php">Les parallèles et les perpendiculaires</a> sont étudiées au cycle 3. """,
               "parallèle":  """<a href="https://site2wouf.fr/paraperp.php">Les parallèles et les perpendiculaires</a> sont étudiées au cycle 3. """,
               "droite":""" <a href="https://site2wouf.fr/elements-geometrie.php">Les éléments de géométrie</a> sont étudiés au cycle 3""" ,
               "segment":""" <a href="https://site2wouf.fr/elements-geometrie.php">Les éléments de géométrie</a> sont étudiés au cycle 3""" ,
               "demi-droite" :""" <a href="https://site2wouf.fr/elements-geometrie.php">Les éléments de géométrie</a> sont étudiés au cycle 3""" ,
               "cercle":""" <a href="https://site2wouf.fr/elements-geometrie.php">Les éléments de géométrie</a> sont étudiés au cycle 3""" ,
               "intersection":""" <a href="https://site2wouf.fr/elements-geometrie.php">Les éléments de géométrie</a> sont étudiés au cycle 3""" ,
               "milieu":""" <a href="https://site2wouf.fr/elements-geometrie.php">Les éléments de géométrie</a> sont étudiés au cycle 3""" ,
                "diamètre":""" <a href="https://site2wouf.fr/elements-geometrie.php">Les éléments de géométrie</a> sont étudiés au cycle 3""" ,
                "rayon":""" <a href="https://site2wouf.fr/elements-geometrie.php">Les éléments de géométrie</a> sont étudiés au cycle 3""" ,
                "corde":""" <a href="https://site2wouf.fr/elements-geometrie.php">Les éléments de géométrie</a> sont étudiés au cycle 3""" ,
                "milliard":""" <a href="https://site2wouf.fr/entiers.php">Le vocabulaire sur les entiers naturels </a> est étudié au cycle 3""" ,
                "million":""" <a href="https://site2wouf.fr/entiers.php">Le vocabulaire sur les entiers naturels </a> est étudié au cycle 3""" ,
                "chiffre":""" <a href="https://site2wouf.fr/entiers.php">Le vocabulaire sur les entiers naturels </a> est étudié au cycle 3""" ,
                "dizaine":""" <a href="https://site2wouf.fr/entiers.php">Le vocabulaire sur les entiers naturels </a> est étudié au cycle 3""" ,
                "centaine":""" <a href="https://site2wouf.fr/entiers.php">Le vocabulaire sur les entiers naturels </a> est étudié au cycle 3""" ,
                "millier":""" <a href="https://site2wouf.fr/entiers.php">Le vocabulaire sur les entiers naturels </a> est étudié au cycle 3""" ,
                "opération":"""Les  <a href="https://site2wouf.fr/exercices_operations_decimaux.php">opérations  </a> doivent être maîtrisées dès le cycle 3.""" ,
                "addition":"""Les  <a href="https://site2wouf.fr/exercices_operations_decimaux.php">opérations  </a> doivent être maîtrisées dès le cycle 3.""" ,
                "soustraction":"""Les  <a href="https://site2wouf.fr/exercices_operations_decimaux.php">opérations  </a> doivent être maîtrisées dès le cycle 3.""" ,
                "multiplication":"""Les  <a href="https://site2wouf.fr/exercices_operations_decimaux.php">opérations  </a> doivent être maîtrisées dès le cycle 3.""" ,
                "division":"""Les  <a href="https://site2wouf.fr/exercices_operations_decimaux.php">opérations  </a> doivent être maîtrisées dès le cycle 3.""" ,
                "statistique":""" On travaille sur les <a href="https://site2wouf.fr/exercices_statistiques.phpp">statistiques</a> à partir du cyclle 4"""   ,
                "moyenne":""" On travaille sur les <a href="https://site2wouf.fr/exercices_statistiques.php">statistiques</a> à partir du cycle 4"""  ,
                "médiane":""" On travaille sur les <a href="https://site2wouf.fr/exercices_statistiques.php">statistiques</a> à partir du cycle 4""" ,
                "étendue":""" On travaille sur les <a href="https://site2wouf.fr/exercices_statistiques.php">statistiques</a> à partir du cycle 4"""   ,
                "fréquence":""" On travaille sur les <a href="https://site2wouf.fr/exercices_statistiques.php">statistiques</a> à partir du cycle 4"""  ,
                "pourcentage":""" On connait les pourcentages au cycle 3 mais on travaille sur les <a href="https://site2wouf.fr/exercices_statistiques.php">statistiques</a> à partir du cycle 4""" ,
                "opposé":""" Ce mot appartient au vocabulaire des nombres <a href="https://site2wouf.fr/exercices_relatifs.php">relatifs</a>""",
                "positif":""" Ce mot appartient au vocabulaire des nombres <a href="https://site2wouf.fr/exercices_relatifs.php">relatifs</a>""",
                "négatif":""" Ce mot appartient au vocabulaire des nombres <a href="https://site2wouf.fr/exercices_relatifs.php">relatifs</a>""",
                "probabilité":"""On étudie les  <a href="https://site2wouf.fr/exercices_probabilites.php">probabilités</a> au cycle 4."""   ,
                "fraction":""" Il faut maîtriser les <a href="https://site2wouf.fr/exercices_fractions.php">fractions</a> en quittant le collège !</a>""",
                "numérateur":""" Il faut maîtriser les <a href="https://site2wouf.fr/exercices_fractions.php">fractions</a> en quittant le collège !</a>""",
                "dénominateur":""" Il faut maîtriser les <a href="https://site2wouf.fr/exercices_fractions.php">fractions</a> en quittant le collège !</a>"""

               }
    jokers=["♥","♦","♣","♠"]
    lemot=choice(list(les_mots.keys())).upper()
    mot=lemot
    while len(mot)<18:
        mot+=choice(jokers)
    m=list(mot)
    shuffle(m)
    mot="".join(m)
    htm+=svg.format(*mot)
    corr= htm
   
    corr+="<h2> La solution : {} </h2> " .format(lemot)
    corr+="""<p style="color:green;">{}</div></p>""".format(les_mots[lemot.lower()])
    htm+="</div>"
 
    return htm,corr


 #preparation des repertoires de sauvegarde                    ,             ,
for repertoire in ("ennonces_html","corriges_html","exercices_pdf"):
    try:
        makedirs(repertoire)
    except:
        pass
haut_de_page= """<h3 style="color:#a5a5c0; margin-bottom:-10px;">Fiche : {}</h3>"""
bas_de_page="""<div style="margin-top:-3px; text-align:right">
<p style="page-break-after: always"><a  href="https://site2wouf.fr">(C) https://site2wouf.fr (2021)</a></p></div>"""
fin="""<div style="margin-top:-3px; text-align:right">
<p><a  href="https://site2wouf.fr">(C) https://site2wouf.fr (2021)</a></p></div>"""




for i in range(1,401):
    print(i)
    enn1,corr1=exercice1()
    enn2,corr2=exercice2()
    sauv_ex(i,enn1+enn2)
    sauv_corr(i,corr1+corr2)
    chaine=haut_de_page.format(str(i)+ "  1/5")
    chaine+="""<h1 style="color:red; text-align:center">&hearts; Jouons ensemble.</h1><div style="margin-left:100px;font-size:16px">"""+enn1+enn2+"</div>"
    chaine+=bas_de_page
    chaine+=haut_de_page.format(str(i)+ "  2/5")
    chaine+="""<h1 style="color:red; text-align:center">&hearts; Jouons ensemble.- Correction -</h1><div style="margin-left:100px;font-size:16px">"""+corr1+corr2+"</div>"
    


    chaine+=fin

    pdfkit.from_string(chaine,"exercices_pdf\exercices{0}.pdf".format(i),configuration=config,options=options)
