##############################################################################
#               Code pour créer un graphe du jeu de Chomp                    #
##############################################################################

import numpy as np

## Fonction intialisation d'une grille

def init_grille(nl:int,nc:int) -> tuple:
    return tuple([tuple([1]*nc)]*nl)

## Fonction d'affichage d'une grille

def affiche_grille(G:tuple) :
    nl,nc=len(G),len(G[0])
    car=[' ','X']
    for l in range(nl):
        ligne=''
        for c in range(nc):
            ligne+=car[G[l][c]]+' '
        print(ligne)

## Fonction renvoyant la grille new_G en jouant le caré (l,c) sur la grille G

def joue(G:tuple,l:int,c:int) -> tuple :
    nl,nc=len(G),len(G[0])
    Lnew_G=[]*nl
    for il in range(nl):
        ligne=[]
        for ic in range(nc):
            if il>=l and ic>=c:
                ligne.append(0)
            else:
                ligne.append(G[il][ic])
        Lnew_G.append(tuple(ligne))
    new_G=tuple(Lnew_G)
    return new_G

## Fonction créant les grilles et le graphe d'un jeu de Chomp nlxnc'

def creation_grilles(nl:int,nc:int) -> None :
    G=init_grille(nl,nc)
    Dgrilles={G:0}
    Graphe={0:[]}
    def sous_grilles(G,Dgrilles,Graphe,l,c):
        nl,nc=len(G),len(G[0])
        for il in range(nl-1,-1,-1):
            for ic in range(nc-1,-1,-1):
                if G[il][ic]==1 and (il,ic)!=(0,0):
                    new_G=joue(G,il,ic)
                    if new_G not in Dgrilles:
                        indice=max(Dgrilles.values())+1
                        Dgrilles[new_G]=indice
                        Graphe[Dgrilles[new_G]]=[]
                        Graphe[Dgrilles[G]]=Graphe[Dgrilles[G]]+[indice]
                        sous_grilles(new_G,Dgrilles,Graphe,il,ic)
                    else:
                        indice=Dgrilles[new_G]
                        Graphe[Dgrilles[G]]=Graphe[Dgrilles[G]]+[indice]
    sous_grilles(G,Dgrilles,Graphe,nl-1,nc-1)
    Grilles={}
    for clef in Dgrilles:
        print("Grille d'indice :",Dgrilles[clef])
        affiche_grille(clef)
        Graphe[Dgrilles[clef]]=sorted(Graphe[Dgrilles[clef]])
        print("Successeurs :",Graphe[Dgrilles[clef]])
        print('---------------------')
        Grilles[Dgrilles[clef]]=np.array(clef)
    return Graphe,Grilles