from trie_fr import Trie

# --------- case de la grille de Ruzzle -------------
 
class Case:
    def __init__(self, value):
        self.value = value
        self.neighbors = []
 
    def addNeighbor(self, neighbor):
        # ajoute un voisin à la liste
        self.neighbors.append(neighbor)

    def getNeighbors(self):
        # renvoie la liste des voisins d'une case
        return self.neighbors

    def getValue(self):
        # renvoie la lettre d'une case
        return self.value

# ----------------------------------------------------


def creer_trie(dico):
    print("Lecture du dictionnaire")
    fichier = open(dico, 'r')
    liste_mots = fichier.readlines()
    fichier.close()
    print("Création du Trie")
    trie = Trie()
    trie.makeTrie(liste_mots)
    print("Trie terminé")
    return trie


def creer_connexions(grille):
    # crée les listes d'adjacences du graphe
    for m in range(16):
        case = grille[m]
        i, j = m//4, m%4
        for n in range(16):
            x, y = n//4, n%4
            if abs(i-x)<=1 and abs(j-y)<=1 and m != n:  # cases voisines
                case.addNeighbor(grille[n])
        voisins=case.getNeighbors()



def chercher(noeud, case, vus=[]):
    # cherche les mots français dans le Trie
    trouves = []
    if noeud == None:
        return trouves
    if noeud.isWordEnd():
        trouves.append(noeud.getLetter())
    vus.append(case)
    for voisin in case.getNeighbors():
        if voisin not in vus:
            results = chercher(noeud[voisin.getValue()], voisin, vus)
            trouves.extend([noeud.getLetter() + ending for ending in results])
    vus.remove(case)
    return trouves
