# -*- coding: utf-8 -*-
"""
Created on Fri Mar 29 15:53:20 2024

@author: François Coulombeau
"""

import numpy as np
import matplotlib.pyplot as plt

def affiche(tableau):
    fig, ax = plt.subplots()
    mem1 = tableau[0][0]
    mem2 = tableau[-1][-1]
    tableau[0][0] = 0
    tableau[-1][-1] = 1
    im = ax.imshow(tableau, cmap = "binary")
    tableau[0][0] = mem1
    tableau[-1][-1] = mem2
    im.set_data(tableau)
    plt.show(block=False)
    fig.tight_layout()
    return ax, im, np.copy(tableau)

def met_a_jour(graphique, case_jouee, delai = None):
    ax, im, tableau = graphique
    n = len(tableau)
    p = len(tableau[0])
    I, J = case_jouee
    if delai is not None:
        plt.pause(delai)
    while ax.texts:
        plt.Artist.remove(ax.texts[0])
    ax.text(J,I,str((I,J)),color="blue",horizontalalignment='center')
    plt.show(block=False)
    if delai is not None:
        plt.pause(delai)
    i,j = I,J
    tableau[i][j] = 1-tableau[i][j]
    i,j = I-1,J
    if 0<=i<n and 0<=j<p:
        tableau[i][j] = 1-tableau[i][j]
    i,j = I+1,J
    if 0<=i<n and 0<=j<p:
        tableau[i][j] = 1-tableau[i][j]
    i,j = I,J-1
    if 0<=i<n and 0<=j<p:
        tableau[i][j] = 1-tableau[i][j]
    i,j = I,J+1
    if 0<=i<n and 0<=j<p:
        tableau[i][j] = 1-tableau[i][j]
    im.set_data(tableau)
    plt.show(block=False)
    return ax, im, np.copy(tableau)

# Travail demandé
def solve(tableau):
    """
    Parameters
    ----------
    tableau : liste de listes d'entiers (ou de booléens)
        Représente la grille de départ.
        Les cases dont la valeur est 0 sont celles qui ne sont pas
        de la bonne couleur. En fin de partie, ces cases devraient avoir
        pour valeur 1.
        Les cases dont la valeur est 1 sont celles qui sont de la bonne
        couleur dès le début de partie. En fin de partie, ces cases devraient
        toujours avoir la valeur 1.
        On rappelle qu'un coup est un couple (i,j) donnant le numéro de ligne
        et le numéro de colonne de la case jouée. Les 4 voisines (gauche, droite, haut et bas)
        ainsi que la case jouée changent alors de couleur **si elles existent**.
        Un coup joué en (0,0) par exemple change la couleur de la case dans l'angle en haut à gauche,
        de sa voisine de droite et de sa voisine du bas

    Returns
    -------
    coups_a_jouer : liste de tuple d'entiers
        La liste des coups (i,j) à jouer pour qu'en fin de partie toutes les cases aient
        pour valeur 1.

    """
    coups_a_jouer = []
    
    
    # A compléter : on veut trouver une liste de coups de telle sorte que,
    # à la fin de la partie, toutes les cases aient la valeur 1.
    
    
    return coups_a_jouer

# Test
# Situation de départ
depart = [[0,0,0], [1,0,0], [0,0,0]]
# Liste de coups à jouer
jeu = [(0,0), (1,2), (2,0)]
# jeu = solve(depart)

# Animation
G = affiche(depart)
for coup in jeu:
    met_a_jour(G, coup, delai = 0.5) # delai: temps d'attente en seconde entre chacuns des coups