# -*- encoding:utf8 -*-

# Fichier : jeuPendu.py
# Auteur : A compléter
# Date : Avril 2021
# Version : 1.2
# Description :

# Module implémentant les différentes classes nécessaires à la réalisation
# du programme JeuPendu.

### Importation de fonctions nécessaires

from random import randint
from datetime import date


#### Classes nécessaires:

class Pendu(object):
    """Classe gérant le jeu du pendu"""

    PENDAISON = ['''

      +---+
      |   |
          |
          |
          |
          |
    =========''', '''

      +---+
      |   |
      O   |
          |
          |
          |
    =========''', '''

      +---+
      |   |
      O   |
      |   |
          |
          |
    =========''', '''

      +---+
      |   |
      O   |
     /|   |
          |
          |
    =========''', '''

      +---+
      |   |
      O   |
     /|\  |
          |
          |
    =========''', '''

      +---+
      |   |
      O   |
     /|\  |
     /    |
          |
    =========''', '''

      +---+
      |   |
      O   |
     /|\  |
     / \  |
          |
    =========''']                       # états du pendu

    mots = 'annexes/mots.txt'           # fichier contenant les mots à trouver


    def __init__(self, pseudo):
        """
        Constructeur du jeu enregistrant les informations du joueur,
        l'état du jeu et lançant le jeu
        """

        # Création de l'objet Joueur associé à la partie lancée
        self.joueur = # A compléter
        # Etat du jeu
        self.jeuTermine = True
        # Lancement d'une partie
        # A compléter


    def start_it(self):
        """
        start_it() --> None.
        Lance une nouvelle partie
        """

        # Initialisation des listes de lettres proposées (correctes et incorrectes)
        # sous forme d'attributs d'instance:
        # A compléter

        # Initialisation du mot secret sous forme d'attribut d'instance:
        # A compléter

        # Mise à jour de l'état du jeu
        self.jeuTermine = False

        while not self.jeuTermine:

            # Affichage de l'état de pendaison
            # A compléter

            # Proposer une lettre
            # A compléter


    def choisirMot(self):
        """
        choisirMot() --> str.
        Retourne de manière aléatoire un mot situé dans le fichier <Pendu.mots>
        """

        # A compléter


    def affichePendu(self):
        """
        affichePendu() --> None.
        Affiche
        1) l'état du pendu situé dans la liste <Pendu.PENDAISON>
        à l'aide du nombre de lettres incorrectes déjà proposées situées dans la liste <lettresIncorrectes>
        2) l'énumération des lettres incorrectes déjà proposées situées dans la liste <lettresIncorrectes>
        3) l'état de la recherche du <motSecret> à partir de la liste <lettresCorrectes> des lettres de <motSecret>
        déjà trouvées.
        
        """
        # A compléter


    def jouer(self):
        """
        jouer() --> None
        Demande à l'utilisateur d'entrer une lettre, controle sa validité, puis gère la lettre proposée
        """

        while 1:

            # Inviter l'utilisateur à entrer une lettre
            # A compléter

            # Contrôler si la proposition est un seul caractère:
            # A compléter

            # Contrôler si la proposition a déjà été suggérée:
            # A compléter

            # Contrôler si la proposition est un caractère autorisé:
            # A compléter
       
            # Garder la proposition:
            # A compléter
            

        # Si la proposition est située dans le motSecret,
        # 1) la rajouter à la liste des lettresCorrectes
        # 2) controler si le joueur a gagné, c'est-à-dire trouvé toutes les lettres
        # A compléter


        # Si la proposition n'est pas située dans le motSecret,
        # 1) la rajouter à la liste des lettresIncorrectes
        # 2) controler si le joueur a perdu, c'est-à-dire si la pendaison est atteinte
        # A compléter

                
    def end_it(self):
        """
        end_it() --> None
        Gère la fin de partie
        """
        # Demander au joueur s'il veut rejouer:
        reponse = input("Voulez-vous jouer une nouvelle partie ? (oui ou non): ").lower()
        if reponse[0] == 'o':
            # Relancer une nouvelle partie
            # A compléter
        else:
            # Termine le jeu
            # Afficher les meilleurs scores du joueur:
            # A compléter               


    def gestionPoints(self):
        """
        gestionPoints() --> None
        Calcule les points générés par une partie et les transmet au joueur
        pour etre sauvegardés.
        """

        # A compléter


      
class Joueur(object):
    """Classe gérant les joueurs du jeu du pendu"""

    def __init__(self, pseudo):
        """
        Constructeur d'un joueur enregistrant le pseudo et générant, si nécessaire,
        le fichier de sauvegarde des différentes parties gagnantes du joueur
        """
        # Pseudo du joueur
        self.pseudo = # A compléter
        # Adresse du fichier contenant les résultats du joueur
        self.resultats = # A compléter

        
    def creerSauvegarde(self):
        """
        creerSauvegarde() --> str
        Crée, s'il n'existe pas, un fichier nommé 'pseudo.txt' dans le sous-dossier 'joueurs' du répertoire 'annexes'
        et y inscrit en première ligne le titre "Résultats de pseudo". Retourne l'adresse du fichier sous forme de string.
        """

        nomFichier = # A compléter

        try:        # tente l'ouverture en mode lecture afin de savoir si le fichier existe
            fichier = open(nomFichier, 'r', encoding='utf8')
            
        except:     # crée le fichier s'il n'existe pas
            fichier = open(nomFichier, 'w', encoding='utf8')
            fichier.write("Résultats de "+ self.pseudo + ":\n")
            fichier.close()
            
        else:
            fichier.close()

        return nomFichier

        
    def sauvegarder(self, motCherche, points):
        """
        sauvegarder(str motCherche, int points) --> None
        Enregistre sur une seule ligne du fichier associé au joueur le nombre de <points>
        réalisé lors de la recherche du <motCherche> au format suivant:

        date(31/3/2019):motCherche@points
        """

        # A compléter

    def trierScores(self):
        """
        trierScores() --> list
        Récupère tous les scores situés dans chacune des lignes du fichier associé au
        joueur et retourne la liste de ces scores sous forme de tuples (points, mot, date)
        triée en fonction du nombre de points
        """

        # A compléter
