import itertools
from woufU import repertoires,sauv_ex,sauv_corr
from random import randint,shuffle,choice,random
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': ''
    }

cote=4
vecteur={x+1 for x in range(cote)}




def sublists_of_set_all_orders(target_set):
    
    def permutations(data, i, length):
        if i == length:
            if set(data) == target_set:
                result.append(list(data))
        else:
            for j in range(i, length):
                data[i], data[j] = data[j], data[i]
                permutations(data, i + 1, length)
                data[i], data[j] = data[j], data[i]
                
    result = []
    permutations(list(target_set), 0, len(target_set))
    return result

def sublists_of_length_n(l, n):
    sublists = list(itertools.permutations(l, n))
    return [sublist for sublist in sublists ]


def accept_list(l):
    col=[ [l[i][j]  for i in range(cote)] for j in range(cote)]
    booleen=True
    for c in col:
        booleen=booleen and len(set(c))==cote
    return booleen


def create_dico():
    dico={}
    resultat = sublists_of_set_all_orders(vecteur)
    a= sublists_of_length_n(resultat, cote)
    bonnes=[ x for x in a if accept_list(x)]
   
    for i in bonnes:
        #print(str(i),str(etudie_listes(i)))
        dico[str(i)]=str(etudie_listes(i))


    #ils ne faut garder que les éléments dont la clef génère  une valeur singulière
    dico2={}    
    for i in dico:
        if list(dico.values()).count(dico[i])==1:
            dico2[i]=dico[i]

        
    return dico2

def etudie_liste(l):
    nb=0
    etage=0
    for x in l:
        if x>etage:
            etage=x
            nb+=1
    nb2=0
    etage=0
    for x in l[::-1]:
        if x>etage:
            etage=x
            nb2+=1

            
    return nb,nb2

def etudie_listes(l):
    reponses=[]
    for li in l:
        reponses.append(etudie_liste(li))
    col=[ [l[i][j]  for i in range(cote)] for j in range(cote)]
    for co in col:
        reponses.append(etudie_liste(co))
    return [x[0] for x in reponses]+[x[1] for x in reponses]

def tableau(t=[x for x in range(36)]):
    chaine='<div style="text-align:center;"><table align="center" style="text-align:center; font-size:200%; border-collapse:collapse">\n'
    chaine+="<tr>\n"
    #première ligne
    for i in range(cote+2):
        chaine+="<td style='height:60px; width:60px;'>"
        chaine+=str(t[i])
        chaine+="</td>"
    chaine+="</tr>\n"

    for j in  range(cote):
        chaine+="<tr>\n"
        chaine+="<td style='height:60px; width:60px;'>"
        chaine+=str(t[(j+1)*(cote+2)])
        chaine+="</td>"
        for i in range(cote):
            chaine+="<td style='height:50px; width:50px;border:2px solid black;'>"
            chaine+=str(t[(j+1)*(cote+2)+i+1])
            chaine+="</td>"
        chaine+="<td style='height:60px; width:60px;'>"
        chaine+=str(t[(j+1)*(cote+2)+cote+1])
        chaine+="</td>"
        chaine+="</tr>\n"
    #derniière ligne
    for i in range(cote+2):
        chaine+="<td style='height:60px; width:60px;'>"
        chaine+=str(t[(cote+2)*(cote+1)+i])
        chaine+="</td>"
    chaine+="</tr></table></div></div>\n"

        
##    with open ("essai.htm", "w",encoding='utf-8') as f:
##        f.write(chaine)   
    return(chaine)
ennonce="""

<div style="clear:both;">
<p style="font-size:120%">La zone ci-dessus contient des immeubles. Dans chaque ligne et chaque colonne apparaissent des immeubles de 1,2,3 et 4 étages.
Les observateurs autour de la zone regardent perpendiculairement au côté où ils se trouvent. Le nombre d'immeubles qu'ils peuvent voir est inscrit.
C'est à vous de retrouver le nombre d'étages de chacun des 16 immeubles de la zone.</p></div>"""

encouragements="""
<div style="clear:both;">
<p style="font-size:150%">Merci d'avoir essayé, et bravo si vous avez trouvé la solution !</p></div>"""
repertoires()
tableau()
a=create_dico()
n=0
for i in a.keys():
    t=[" "]+eval(a[i])[4:8]+[" "]
    t+=[eval(a[i])[0]]+cote*[" "]+[eval(a[i])[8]]
    t+=[eval(a[i])[1]]+cote*[" "]+[eval(a[i])[9]]
    t+=[eval(a[i])[2]]+cote*[" "]+[eval(a[i])[10]]
    t+=[eval(a[i])[3]]+cote*[" "]+[eval(a[i])[11]]                          
    t+=[" "]+eval(a[i])[12:]+[" "]
    print(n)
    chaine="""<h2 style="color:red; text-align:center; margin:50px">Les immeubles :  {}/371</h2><div><div style=" width:50%; text-align:center"><img src="https://site2wouf.fr/images/Immeubles.jpg"/></div>""".format(n)
    chaine+=tableau(t)
    chaine+=ennonce
    sauv_ex(n,chaine)
    t=[" "]+eval(a[i])[4:8]+[" "]
    t+=[eval(a[i])[0]]+eval(i)[0]+[eval(a[i])[8]]
    t+=[eval(a[i])[1]]+eval(i)[1]+[eval(a[i])[9]]
    t+=[eval(a[i])[2]]+eval(i)[2]+[eval(a[i])[10]]
    t+=[eval(a[i])[3]]+eval(i)[3]+[eval(a[i])[11]]                          
    t+=[" "]+eval(a[i])[12:]+[" "]
    chaine2="""<h2 style="color:red; text-align:center; margin:50px">Les immeubles : correction {}/371</h2><div><div style=" width:50%; text-align:center"><img src="https://site2wouf.fr/images/Immeubles.jpg"/></div>""".format(n)
    chaine2+=tableau(t)
    chaine2+=encouragements
    sauv_corr(n,chaine2)
    bas_de_page="""<div style="margin-top:-25px; text-align:right">  
<p style="page-break-after: always"><a  href="https://site2wouf.fr">(C) https://site2wouf.fr (2023)</a></p></div>"""

    fin="""<div style="margin-top:100px; text-align:right">  
<p><a  href="https://site2wouf.fr">(C) https://site2wouf.fr (2023)</a></p></div>"""
    pdf=chaine+bas_de_page+chaine2+fin
    
    pdfkit.from_string(pdf,"exercices_pdf\exercices{0}.pdf".format(n),configuration=config,options=options)
    n+=1






