import pandas as pd
from sqlalchemy import create_engine, text
from tqdm import tqdm

# 1. Configuration de la connexion à la base de données
db_user = "root"
db_password = "_z7b6CJc"
db_host = "localhost"
db_name = "immo_new"
db_port = "3306"

# Crée l'URL de connexion
db_url = f"mysql+pymysql://{db_user}:{db_password}@{db_host}:{db_port}/{db_name}"
engine = create_engine(db_url)

# 2. Charger les villes existantes depuis la table cities
query_cities = "SELECT id, insee_code FROM cities"
df_cities = pd.read_sql(query_cities, engine)

# 3. Lire le fichier IRIS
df_iris = pd.read_csv(
    "iris.csv",
    sep=";",
    quotechar='"',
    dtype={
        "Code Officiel Commune": str,
        "Nom Officiel IRIS": str,
        "Geo Point": str,
    },
    on_bad_lines="warn",
)

# 4. Extraire latitude et longitude depuis "Geo Point"
df_iris[["latitude", "longitude"]] = df_iris["Geo Point"].str.split(", ", expand=True).astype(float)

# 5. Filtrer les IRIS pour ne garder que ceux des villes existantes
insee_codes = df_cities["insee_code"].tolist()
df_iris_filtered = df_iris[df_iris["Code Officiel Commune"].isin(insee_codes)]

# 6. Fusionner avec df_cities pour obtenir city_id
df_to_insert = df_iris_filtered.merge(
    df_cities, left_on="Code Officiel Commune", right_on="insee_code", how="left"
)[["Nom Officiel IRIS", "Code Officiel Commune", "id", "latitude", "longitude"]]
df_to_insert.columns = ["district_name", "insee_code", "city_id", "latitude", "longitude"]

# 7. Supprimer les doublons éventuels
df_to_insert = df_to_insert.drop_duplicates(subset=["insee_code", "district_name"])

# 8. Insérer par lots de 1000
batch_size = 1000
total_rows = len(df_to_insert)

with engine.connect() as conn:
    for i in tqdm(range(0, total_rows, batch_size), desc="Insertion en cours"):
        batch = df_to_insert.iloc[i:i + batch_size]
        batch.to_sql(
            "districts",
            con=engine,
            if_exists="append",
            index=False,
            method="multi",  # Optimisation pour les insertions multiples
        )
        conn.commit()  # Valider après chaque lot

print(f"Insertion terminée. {total_rows} quartiers insérés.")