#  Jeu du Pendu: solution étape 2

from tkinter import *
from random import *
from datetime import date

### Classe principale de l'application ###
#----------------------------------------#

class Application(Tk):

    def __init__(self):
        Tk.__init__(self)
        self.title("Jeu du Pendu")
        self.configure(bg="#2C2F10")

        # pseudo du joueur:
        self.pseudo = ""

        # Création de la zone de texte présentant le jeu:
        Label(self, text="""Entrez une lettre grâce au clavier ci-dessous.\n
Si elle se trouve dans le mot secret, elle sera affichée.\n
Sinon, la sentence se rapprochera...""",
              font=("Comic sans Ms", 14), justify=CENTER, bg='#2C2F10',
              fg="#F0E39E").grid(row = 1, column = 1)

        # Création du clavier:
        self.clavier = Clavier(self, command = self.proposer)
        self.clavier.grid(row = 2, column = 1, padx=5, pady=5)

        # Création de la zone de texte recevant le mot caché:
        self.etatMot = Label(self, text="Appuyez sur l'image pour commencer",
                             font=("Comic sans Ms", 14), fg='red', bg="#cbd888")
        self.etatMot.grid(row=3, column = 1, pady=5)

        # Création du Canevas contenant l'image:
        self.can = Canvas(self, width=250, height=350, bg='#2C2F10', bd=0)
        self.can.grid(row = 1, column = 2, rowspan=3, columnspan=3, padx=10, pady=10)
        self.can.bind("<Button-1>", self.start_it)

        # Affichage de la photo initiale:
        self.photo = PhotoImage(file='annexes/images/intro.gif')
        self.imagePendu = self.can.create_image(125, 175, image=self.photo)

        # Création des boutons:
        Button(self, text="Login", bg="#A65400", fg="white", activebackground="#BF7830",
               activeforeground="black", font=("Comic sans Ms", 10, 'bold'),
               command=self.login).grid(row=4, column=2, pady=5)

        Button(self, text="Scores", bg="#A65400", fg="white", activebackground="#BF7830",
               activeforeground="black", font=("Comic sans Ms", 10, 'bold'),
               command=self.score).grid(row=4, column=3, pady=5)

        Button(self, text="Quitter", bg="#A65400", fg="white", activebackground="#BF7830",
               activeforeground="black", font=("Comic sans Ms", 10, 'bold'),
               command=self.quit).grid(row=4, column=4, pady=5)


        # Création du titre du jeu:
        self.titre = self.can.create_text(125, 20, text="Jeu du Pendu",
                                          font=("Comic sans Ms", 20, 'bold'), fill="red")

        # Création de la zone de texte affichant des messages à l'utilisateur
        self.message = self.can.create_text(125, 310, font=("Comic sans Ms", 12, 'bold'), justify = CENTER,
                                       fill='white')

        # Interrupteur de partie:
        self.jeuTermine = True

    ##################################################
    ### Méthodes nécessaires au déroulement du jeu ###
    ##################################################

    def choisirMot(self, nomFichier):
        """
        choisirMot(str nomFichier) --> str.
        Retourne de manière aléatoire un mot situé dans le fichier <nomFichier>
        après lui avoir enlevé ses accents et l'avoir mis en majuscules
        """

        fichier = open(nomFichier, 'r', encoding='utf8')

        listeMots = fichier.readlines()

        fichier.close()

        index = randint(0, len(listeMots)-1)

        mot = listeMots[index][:-1]     # suppression du caractère de fin de ligne

        # retourne le mot choisi en majuscule et exempt d'accent:
        return (self.enleveAccent(mot).upper()).strip()

    def enleveAccent(self, chaine):
        """
        enleve_accent(str chaine) --> str.
        Enlève les accents d'une chaine de caractères
        """
        result = ""
        for c in chaine:
            if c == 'é' or c == 'è' or c == 'ê' or c == 'ë':
                c = 'e'
            elif c == 'à' or c == 'ä' or c == 'â':
                c = 'a'
            elif c == 'ù' or c == 'û':
                c = 'u'
            elif c == 'ô' or c == 'ò':
                c = 'o'
            elif c == 'î' or c == 'ï':
                c = 'i'
            elif c == 'ç':
                c = 'c'
            result += c
        return result
    

    def affichePendu(self, lettresIncorrectes, lettresCorrectes, motSecret):
        """
        affichePendu(list lettresIncorrectes, list lettresCorrectes, str motSecret) --> None
        Affiche l'image du pendu dont le numéro correspond à la taille de la liste <lettresIncorrectes>
        ainsi que l'état de la recherche du mot secret à partir de la liste <lettresCorrectes>
        """
    
        # Afficher l'état du pendu (élément self.imagePendu):
        i = len(lettresIncorrectes)
        self.photo = PhotoImage(file='annexes/images/pendu_{}.gif'.format(i))
        self.can.itemconfigure(self.imagePendu, image=self.photo)

        # Afficher l'état du mot secret (Label self.etatMot):
        espaces = '_ ' * len(motSecret)

        for i in range(len(motSecret)): # remplace les espaces du mot secret par les lettres manquantes correctes
            if motSecret[i] in lettresCorrectes:
                espaces = espaces[:2*i] + motSecret[i] + espaces[2*i+1:]

        self.etatMot.configure(text=espaces)

        # Effacer l'éventuel message adressé à l'utilisateur (élément dans self.message)
        self.can.itemconfigure(self.message, text="")



    def proposer(self, lettre):

        print(lettre)
        
        
    

    ###########################################
    ### Méthodes gestionnaires d'événements ###
    ###########################################


    def start_it(self, event):
        """
        start_it(self, event) --> None
        Si le jeu est terminé, initialise les attributs nécessaires
        à une nouvelle partie
        """

        if self.jeuTermine:

            # listes des lettres proposées
            self.lettresCorrectes = []
            self.lettresIncorrectes = []

            # choix du mot secret:
            self.motSecret = self.choisirMot('annexes/mots.txt')

            # état du jeu:
            self.jeuTermine = False

            # lancement du jeu:
            self.affichePendu(self.lettresIncorrectes, self.lettresCorrectes,
                              self.motSecret)

            # Ligne de test permettant de visualiser le mot choisi dans la console:
            print(self.motSecret)

                    
    def login(self):
        "Instancie une fenetre d'inscription"
        Inscription(self, bg = "#2C2F10")

    def score(self):
        "Instancie une fenetre avec les 3 meilleurs scores"
        BestScore(self, bg = "#2C2F10")


### Classes subordonnées de l'application ###
#-------------------------------------------#

class Clavier(Frame):
    "Clavier d'entrée des lettres"

    def __init__(self, boss, command=None):
        
        Frame.__init__(self, boss, bd=1, bg="#cbd888")

        # clavier centré au milieu du cadre:
        i = 0
        lettre = "A"
        colonne = [0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,2,3,4,5,6,7]
        while i < 26:
            ln = 1 + (i//10)
            col = colonne[i]
            Button(self, text=lettre, bg="#A65400", fg="white", activebackground="#BF7830",
                   activeforeground="black", font=("Comic sans Ms", 10, 'bold'),
                   command=lambda arg=lettre: command(arg)).grid(row=ln, column=col, pady=3, padx=2)
            lettre = chr(ord(lettre) + 1)
            i += 1

class Inscription(Toplevel):
    "Fenetre satellite permettant à l'utilisateur de s'inscrire"
    

class BestScore(Toplevel):
    "Fenetre satellite permettant de visualiser les meilleurs scores"
     
            
#### Partie principale du programme ###
#-------------------------------------#
monApp = Application()          # instanciation du jeu
monApp.mainloop()               # lancement du réceptionnaire d'événements
monApp.destroy()                # destruction du jeu lors de la fermeture finale des fenetres   
