from woufU import repertoires,sauv_ex,sauv_corr
from random import randint,shuffle,choice,random
import pdfkit

class Immeuble:
    def __init__(self,etages,possibles,depart=0):
        self.etages=etages
        self.possibles=possibles
        self.depart=depart

class Voyage:
    def __init__(self,passe,i):
        self.passe=passe
        self.i=i
        
    def enfants(self):
        boutons=[]
        if len(self.passe)==0:
            self.passe=[self.i.depart]
        for j in self.i.possibles:
            if  self.passe[-1]+j in [x for x in self.i.etages if x not in self.passe]:
                boutons.append(j)
        liste=[]
        
        for j in boutons :
            newpasse=[x for x in self.passe]
            newpasse.append(self.passe[-1]+j)
            liste.append(newpasse)
          
        return [Voyage(l,self.i) for l in liste]


    


def etudie(x,y,z):
    i=Immeuble(x,y,z)
    v=Voyage([],i)
    n=2
    liste=[Voyage(x.passe,i) for x in v.enfants()]
    oldliste=liste
    while len(liste) !=0:
        n+=1
        newliste=[]
        for k in liste:
            for l in k.enfants():
                newliste.append(Voyage(l.passe,i))
        oldliste=liste
        liste=[x for x in newliste]
    if len(oldliste)==1:
        if len (oldliste[0].passe)==len(x):
            return oldliste[0].passe
    
    
    
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 prenom():
    """renvoie un prénom"""
    p=[word.strip() for word in open("prenom.txt", encoding="utf-8")]
    shuffle(p)
    return p[0][0].upper()+p[0][1:]


def exercice1():
    ok=False
    while not ok:
        nb_etage=choice([7,8,9,10,11,12,13,14,15,16,17])
        nbssol=choice([2,3])  
        etage=choice(list(range(nb_etage-nbssol)))+nbssol
        choix=list(range(-nb_etage+1, nb_etage-1))
        choix.remove(0)
        choix.remove(-1)
        choix.remove(1)
        shuffle(choix)
        choix=choix[:3]
        choix_s=[]
        for i in choix:
            if i<0:
                choix_s.append(str(i))
            else:
                choix_s.append("+"+str(i))
         
        # print ("A;",list(range(nb_etage)))
        # print(choix)
        # print(etage)
        a=etudie(list(range(nb_etage)),choix,etage)
        if a!=None:
            ok=True
                                                
       
         
            
    with open("elevator.svg", "r", encoding='utf-8') as f:
          svg=f.read()
    svg=svg.replace("ù","{}")
    
    pren=prenom()
    
    deplacements=[]
    for d in choix:
        if d>0:
            deplacements.append("monter de {} étages.".format(d))
        else:
            deplacements.append("descendre de {} étages.".format(-d))
            
    htm="""<h2 style="font-size:120%; color:red;">Problème :</h2>
    
    <p>Cet immeuble a {} étages, plus le rez-de-chaussée, et {} sous-sol. {} habite à l'étage {}.
    
   </p>
   <p>L'ascenseur de la résidence est très particulier, il ne dispose que de trois boutons.</p>
   <ul>
   <li> Le premier permet de {}</li>
   <li> Le deuxième permet de {}</li>
   <li> Le troisième permet de {}</li> </ul>
   <p> {} prétend qu'il est possible, en partant de son étage, en ascenseur, de rejoindre tous les
   étages, sans s'arréter deux fois au même endroit ! </p>
   <p style="color:red;" > Il n'y a qu'une seule solution, saurez-vous la trouver ?<p>
   """.format(nb_etage-1-nbssol,nbssol,pren,etage-nbssol,*deplacements,pren)
    htm+="""<div style="margin-left:100px;font-size:16px">"""+svg.format(*choix_s,-nbssol,etage-nbssol,nb_etage-1-nbssol)
    aff=[str(u-nbssol) for u in a]
    corr="""<h2 style="color:red">La solution : {} </h2>
    """.format(" &#x27AB; ".join(aff))
   
    corr+=svg.format(*choix_s,-nbssol,etage-nbssol,nb_etage-1-nbssol)
  
    corr+="""<p style="margin:0">
     <span style="background-color:grey; border:1px solid black; width:100px;text-align:center;display:inline-block; margin:0"> 
     Etage</span><span style="background-color:grey; border:1px solid black; width:100px;text-align:center;display:inline-block; margin:0"> 
     Bouton</span></p>
     """
    for e in a:
        corr+="""<p style="margin:0">"""
        corr+="""<span style="border:1px solid black; width:100px;text-align:center;display:inline-block; margin:0"> {} </span>""".format(str(e-nbssol))
        try:
           if a[a.index(e)+1]-e>0:
               bo="+"+str(a[a.index(e)+1]-e)
           else:
               bo=str(a[a.index(e)+1]-e)
           corr+="""<span style="border:1px solid black; width:100px;text-align:center;display:inline-block; margin:0"> {} </span>""".format(bo)
        except:
           pass
        corr+="</p>"
    corr+=u"<h2>Explications :</h2>"
    corr+="<p> Avec {}, nous partons de l'étage {}. </p>".format(pren,etage-nbssol)
    for e in a[1:]:
        if e-a[a.index(e)-1]>0:
            corr+="<p> Nous montons de {} étages et nous retrouvons à l'étage {}.<p>".format(e-a[a.index(e)-1],e-nbssol)
        else:
            corr+="<p> Nous descendons de {} étages et nous retrouvons à l'étage {}.<p>".format(-e+a[a.index(e)-1],e-nbssol) 
    corr+="<h2>Mission accomplie !</h2> "
    return htm,corr

    
 

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>"""
repertoires()
for j in range(1,401):
    print(j)
    enn1,corr1=exercice1()
    
    sauv_ex(j,enn1)
    sauv_corr(j,corr1)
    chaine=haut_de_page.format(str(j)+ "&nbsp;&nbsp;&nbsp;&nbsp;  1/2")
    chaine+="""<h1 style="color:red; text-align:center">&hearts;  L'ascenseur fou fou fou (2)</h1><div style="margin-left:100px;font-size:16px">"""+enn1+"</div>"
    chaine+=bas_de_page
    

    chaine+=haut_de_page.format(str(j)+ "&nbsp;&nbsp;&nbsp;&nbsp;  2/2")
    chaine+="""<h1 style="color:red; text-align:center">&hearts;   L'ascenseur fou fou fou (2)- Correction -</h1><div style="margin-left:100px;font-size:16px">"""+corr1+"</div>"
   


    chaine+=fin

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