# -*- coding:utf-8 -*-

__nom_fichier__ = "case"
__author__ = "tinet & Fay-Varnier"
__date__ = "avril 2018"

"""
Exercices récapitulatifs

Le Sudoku

Classe Case

"""

# Comptage de lignes :
# Case : 5 (__init__) + 2 (getEtat) + 2 (getDomaine) + 4 (__str__) + 7 (reduitDomaine) + 2 (fixeValeur)
# Total : 29 lignes

class Case:

    def __init__(self, valeur = 0):
        """
        Constructeur de la classe Case. Créé le domaine des possibles de la case
        :param valeur: int, 0 si la case est inconnue, un entier entre 1 et 9 sinon
        """
        if valeur == 0:
            self.domaine_ = [1, 2, 3, 4, 5, 6, 7, 8, 9]
        else:
            self.domaine_ = [valeur]

    def get_etat(self):
        """
        Accesseur de l'état de la case.
        :return: True si l'état de la casse est connue (domaine avec une seule valeur) False sinon
        """
        return len(self.domaine_)==1

    def get_domaine(self):
        """
        Accesseur du domaine des possibles.
        :return: liste de int
        """
        return self.domaine_

    def __str__(self):
        """
        Surcharge de print et str
        :return: str
        """
        if self.get_etat():
            return str(self.domaine_[0])

        return str(self.domaine_)

    def reduit_domaine(self, liste_valeurs):
        """
        Mise à jour de la liste des possibles en supprimant les valeurs présentes dans liste_valeurs
        Indique si une modification a été faite.
        :param liste_valeurs: liste de int
        :return: True si on a enlevé au moins une valeur False sinon
        """

        # La case est connue, on ne fait rien
        if self.get_etat():
            return False

        flag = False    # permet de retourner s'il y a eu un changement ou pas
        for valeur in liste_valeurs:

            # Mise à jour du domaine
            if valeur in self.domaine_:
                self.domaine_.remove(valeur)
                flag = True

        return flag

    def fixe_valeur(self, valeur):
        """
        Fixe le domaine à la valeur donnée.
        :param valeur: int, entre 1 et 9
        :return: modifie le domaine de la case
        """
        self.domaine_ = [valeur]

if __name__ == '__main__':
    caz1 = Case(4)
    print(caz1)

    caz2 = Case(0)
    print(caz2)
    caz2.reduit_domaine([3, 7, 8])
    print(caz2)
    caz2.reduit_domaine([3, 6])
    caz2.fixe_valeur(2)
    print(caz2)


