# -*- coding: utf-8 -*-

##  Name:           adjacences.py
##  Modification:   CFV
##  Date: 	        avril 2020
##  Description:    programme de recherche des adjacences entre les  régions d'une carte données
from coloriage_carte.scripts.decompression import decompresse_carte


def ajoute_adjacence(dicoAdj, r1, r2):
    """
    @param dicoAdj: dictionnaire qui associe à une région la liste de ces voisins
    @param r1:      nom de région 1
    @param r2:      nom de région 2
    :return:        complète dicoAdj en ajoutant la relation de voisinage symétrique entre r1 et r2
    """
    # on n'ajoute une relation d'adjacence que si les deux regions sont differentes
    if r1 != r2:

        # on teste si r1 et r2 apparaissent déjà dans la table d'adjacence
        if r1 not in dicoAdj:
            # r1 n'apparait pas encore dans la table d'adjacence
            # on cree l'entree dans la table d'adjacence
            dicoAdj[r1] = [r2]
        else:
            # on ajoute r2 si elle n'est pas deja dans la liste
            # des regions adjacentes a r1
            # et vice et versa
            if r2 not in dicoAdj[r1]:
                dicoAdj[r1].append(r2)

        # operations symetriques pour r1 voisin de r2
        if r2 not in dicoAdj:
            # on cree l'entree dans la table d'adjacence
            dicoAdj[r2] = [r1]

        else:
            if r1 not in dicoAdj[r2]:
                dicoAdj[r2].append(r1)


def cherche_adjacences(carte):
    """
    @param carte:   carte matrice
    @return:        la table d'adjacence
                    c'est à dire la liste des voisins pour chaque region de la carte
                    dicoAdj tel que : dicoAdj[reg] = liste des régions adjacentes (voisines) de reg
    """

    # initialisation de la table d'adjacences
    dicoAdj = {}

    nbl = len(carte)  # nombre de lignes
    nbc = len(carte[0])  # nombre de colonnes

    for l in range(nbl - 1):
        # recherche des adjacences sur les lignes
        # on exclut la dernière ligne qu'on traitera à part car elle n'a pas de voisin du dessous
        for c in range(nbc - 1):
            # parcours de toutes les colonnes sauf la dernière
            # qu'on traitera à part car elle n'a pas devoisin de droite

            # on ajoute l'adjacence avec la région voisine de droite
            ajoute_adjacence(dicoAdj, carte[l][c], carte[l][c + 1])

            # on ajoute l'adjacence avec la région voisine du dessous
            ajoute_adjacence(dicoAdj, carte[l][c], carte[l + 1][c])

        # recherche des adjacences pour la dernière colonne
        # juste sur les voisins du dessous
        # l'indice -1 désigne la dernière case
        ajoute_adjacence(dicoAdj, carte[l][-1], carte[l + 1][-1])

    # recherche des adjacences pour la dernière ligne
    # juste sur voisins de droite
    for c in range(nbc - 1):
        # ajout adjacence avec voisin de droite
        # l'indice -1 désigne la dernière case
        ajoute_adjacence(dicoAdj, carte[-1][c], carte[-1][c + 1])

    return dicoAdj


if __name__ == '__main__':
    carte = [["C", 4, "F", 3],
             ["C", 1, "B", 1, "D", 1, "B", 2, "E", 1, "F", 1],
             ["A", 1, "B", 4, "E", 1, "A", 1],
             ["A", 7]]
    matrice_carte = decompresse_carte(carte)
    dico_adj = cherche_adjacences(matrice_carte)
    print(dico_adj)
