### Modules

from os import getcwd                       # Pour vérifier le répertoire courant d'éxécution
from modules import ModuleTPGlouton as TP   # Q0, utilisée dès Q2
from random import shuffle                  # ajout Q8

### Fonctions

## début Q3 (et par la suite Q6 et Q8)
def coloration_gloutonne(voisins_de_zone:dict, couleurs:list,aleacouleur=False):
    """ construit un dictionnaire associant une couleur à chaque zone
    voisins_de_zone: dictionnaire. voisins_de_zone[nom_de_zone]=liste_de_ses_voisins
    couleurs: liste de couleurs
    d'après https://ian-r-rose.github.io/mapping-california-cities.html
    """
    couleur_de_zone = dict()
    ## début ajout Q6
    nbzones=len(voisins_de_zone)
    zonestraitees=0
    ## fin ajout Q6
    for zone, voisins in voisins_de_zone.items(): # pour chaque zone, on essaie de trouver une couleur
        # début - construction de la liste des couleurs des voisins
        couleurs_prises=[]#liste des couleurs voisines
        for vois in voisins:
            if vois in couleur_de_zone:
                couleurs_prises.append(couleur_de_zone[vois])
        # fin - construction de la liste des couleurs des voisins

        couleur_trouvee=False
        if aleacouleur:
            shuffle(couleurs) ## Ajout Q8 : on peut mélanger les couleurs pour ne pas toujours commencer par la même
        for coul in couleurs: # parcours des couleurs

            if not couleur_trouvee and coul not in couleurs_prises:
                couleur_de_zone[zone] = coul
                couleur_trouvee=True
        # Si la clé zone n'a pas été ajoutée, c'est qu'aucune couleur n'est possible : assert couleur_trouvee ou:
        assert zone in couleur_de_zone, f'{len(couleur_de_zone) }/{len(voisins_de_zone) } couleurs de zones choisies .\nMais pas de couleur trouvée pour {zone}'
        ## début ajout Q6
        zonestraitees=zonestraitees+1
        print(f"{zonestraitees} zones traitees sur {nbzones}")
        ## fin ajout Q6
    return couleur_de_zone
## fin Q3 (et par la suite Q6 et Q8)

## début Q9
def triInsertion(L):
    """Tri en place d'une liste L
    D'après TP tri par insertion et tri rapide"""
    n = len(L)
    for i in range(1,n):
        aPlacer = L[i]                                  # Ligne à modifier par rapport au TP précédent

        k = i-1
        while k>=0 and len(L[k][1])<len(aPlacer[1]):    # Ligne à modifier par rapport au TP précédent
            L[k+1]=L[k]
            k = k - 1
        L[k+1] = aPlacer
    return None

def partition(L:list, a:int, b:int):
    """Partition en place d'une liste L entre les éléments d'indice a et b
    D'après TP tri par insertion et tri rapide"""
    pivot = L[b]

    iPivot = a
    for i in range(a,b):
        if len(L[i][1]) >= len(pivot[1]):               # Ligne à modifier par rapport au TP précédent
            L[i],L[iPivot]=L[iPivot],L[i]
            iPivot = iPivot + 1

    L[b] = L[iPivot]
    L[iPivot] = pivot

    return iPivot

def triRapide(L: list, a:int, b:int):
    """
    Tri de la liste L entre les éléments d'indice a et b
    D'après TP tri par insertion et tri rapide
    """
    # Rien à modifier par rapport au TP précédent
    if b>a:
        iPivot = partition(L, a, b)
        triRapide(L, a, iPivot-1)
        triRapide(L, iPivot+1, b)
    return None
## fin Q9

### code principal
print(getcwd()) # Pour vérifier le répertoire courant d'éxécution

## Début Q1
n=2 # ajouté pour simplifier/jouer à partir de Q8
fic=open('donnees/voisins_{}.csv'.format(str(n)), 'r', encoding="utf-8")
ListeLignes=fic.readlines () #retourne la liste de toutes les lignes
fic.close () # Fermeture du fichier
## fin Q1
L_voisins=TP.mise_en_forme_liste_voisins(ListeLignes)
triRapide(L_voisins,0,len(L_voisins)-1) # Application Q9
#ou triInsertion(L_voisins)

## Début Q2
dict_voisins = { couples[0] : couples[1] for couples in L_voisins }
""" ou alors pas en compéhension:
dict voisins={}
for couples in L_voisins_tri:
    dict voisins{couples[0]=couples[1]}
"""
## Fin Q2

## Début Q4
liste_couleurs=['#fbb4ae','#b3cde3','#ccebc5','#decbe4','#fed9a6']
# autres couleurs:['#e41a1c','#377eb8','#4daf4a','#984ea3','#ff7f00','#ffff33','#ffffcc']
couleurs_zones = coloration_gloutonne(dict_voisins, liste_couleurs,True)
## Fin Q4

## Début Q5 : Tracé

carte=TP.tracer_carte(couleurs_zones,n)

carte.show()
##Fin Q5 : Tracé
