import csv
import mysql.connector
from tqdm import tqdm  # Pour afficher une barre de progression (installer avec `pip install tqdm`)

# Configuration
csv_file = "019HexaSmal.csv"
db_config = {
    "host": "localhost",
    "user": "root",
    "password": "_z7b6CJc",
    "database": "immo_new"
}

# 1. Charger les codes postaux depuis le CSV
insee_to_postal = {}
with open(csv_file, 'r', encoding='iso-8859-1') as file:
    next(file)  # Sauter la première ligne (commentaire)
    reader = csv.DictReader(file, delimiter=';', fieldnames=[
        'Code_commune_INSEE',
        'Nom_de_la_commune',
        'Code_postal',
        'Libellé_d_acheminement',
        'Ligne_5'
    ])
    next(reader)  # Sauter l'en-tête

    for row in reader:
        insee_code = row['Code_commune_INSEE'].strip()
        postal_code = row['Code_postal'].strip()

        if insee_code and postal_code:
            if insee_code not in insee_to_postal:
                insee_to_postal[insee_code] = set()
            insee_to_postal[insee_code].add(postal_code)

# 2. Mettre à jour la base de données par lots
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor()

# Récupérer les villes à mettre à jour
cursor.execute("""
    SELECT insee_code
    FROM cities
    WHERE postal_code IS NULL OR postal_code = ''
""")
cities = [row[0].strip() for row in cursor.fetchall()]

# Filtrer les villes avec un code postal disponible
cities_to_update = [city for city in cities if city in insee_to_postal]

# Mettre à jour par lots de 1000
batch_size = 1000
updated = 0

for i in tqdm(range(0, len(cities_to_update), batch_size), desc="Mise à jour des codes postaux"):
    batch = cities_to_update[i:i + batch_size]
    updates = []

    for insee_code in batch:
        postal_codes = sorted(insee_to_postal[insee_code])
        updates.append((postal_codes[0], insee_code))

    # Exécuter la mise à jour par lot
    cursor.executemany(
        "UPDATE cities SET postal_code = %s WHERE insee_code = %s",
        updates
    )
    updated += len(updates)

    # Valider les modifications toutes les 1000 mises à jour
    conn.commit()

print(f"\n{updated} villes mises à jour avec leur code postal.")

# Fermer la connexion
cursor.close()
conn.close()
