import pandas as pd
import mysql.connector
import numpy as np
from tqdm import tqdm  # Pour afficher une barre de progression (optionnel)

# 1. Charger le fichier CSV
df = pd.read_csv("base-des-lieux-et-des-equipements-culturels.csv", sep=";", encoding="utf-8")

# 2. Sélectionner et nettoyer les colonnes utiles
df_clean = df[[
    "Nom", "Adresse", "Code Postal",
    "Type équipement ou lieu", "Domaine", "Sous_domaine",
    "code_insee", "Latitude", "Longitude"
]].copy()

# Renommer les colonnes
df_clean.columns = [
    "service_name", "address", "postal_code",
    "original_category", "domain", "subdomain",
    "insee_code", "latitude", "longitude"
]

# 3. Nettoyage complet des données
# Remplacer les NaN par des chaînes vides pour les colonnes texte
df_clean = df_clean.fillna({
    "service_name": "",
    "address": "",
    "postal_code": "",
    "original_category": "",
    "domain": "",
    "subdomain": "",
    "insee_code": "",
    "latitude": 0.0,  # Valeur par défaut pour éviter les NaN
    "longitude": 0.0
})

# Convertir explicitement les colonnes en types appropriés
df_clean = df_clean.astype({
    "service_name": str,
    "address": str,
    "postal_code": str,
    "original_category": str,
    "domain": str,
    "subdomain": str,
    "insee_code": str
})

# Nettoyer les codes INSEE (5 premiers caractères)
df_clean["insee_code"] = df_clean["insee_code"].str[:5]

# Supprimer les lignes sans coordonnées valides ou sans code INSEE
df_clean = df_clean[
    (df_clean["latitude"] != 0.0) &
    (df_clean["longitude"] != 0.0) &
    (df_clean["insee_code"] != "")
]

# Tronquer les colonnes texte
df_clean["service_name"] = df_clean["service_name"].str[:255]
df_clean["address"] = df_clean["address"].str[:255]
df_clean["postal_code"] = df_clean["postal_code"].str[:10]
df_clean["original_category"] = df_clean["original_category"].str[:100]

# 4. Mapping des catégories (en anglais)
category_mapping = {
    "Scène": "theatre",
    "Centre culturel": "cultural_centre",
    "Bibliothèque": "library",
    "Musée": "museum",
    "Cinéma": "cinema",
    "Salle de concert": "concert_hall",
    "Théâtre": "theatre",
    "Galerie d'art": "art_gallery",
    "École de musique": "music_school",
    "École de danse": "dancing_school",
    "Médiathèque": "library",
    "Patrimoine": "heritage"
}

# Appliquer le mapping des catégories
df_clean["category"] = df_clean["original_category"].map(category_mapping)

# Gestion des catégories non mappées
domain_to_english = {
    "Arts du spectacle": "performing_arts",
    "Patrimoine": "heritage",
    "Livre et lecture": "library",
    "Musique": "music",
    "Danse": "dance",
    "Cinéma et audiovisuel": "cinema"
}

df_clean["category"] = df_clean["category"].fillna(
    df_clean["domain"].map(domain_to_english)
)

# Remplacer les catégories restantes par "other"
df_clean["category"] = df_clean["category"].fillna("other")

# 5. Supprimer les doublons
df_clean = df_clean.drop_duplicates(
    subset=["service_name", "insee_code", "category"],
    keep="first"
)

# 6. Connexion à la base de données
db_config = {
    "host": "localhost",
    "user": "root",
    "password": "_z7b6CJc",
    "database": "immo_new"
}

connection = mysql.connector.connect(**db_config)
cursor = connection.cursor()

# 7. Préparer les données pour l'insertion
data_to_insert = []
for _, row in df_clean.iterrows():
    # Convertir les valeurs en types SQL-compatibles
    service_name = row["service_name"] if row["service_name"] else ""
    address = row["address"] if row["address"] else ""
    postal_code = row["postal_code"] if row["postal_code"] else ""
    original_category = row["original_category"] if row["original_category"] else ""
    category = row["category"] if row["category"] else "other"
    insee_code = row["insee_code"] if row["insee_code"] else ""

    # Convertir latitude/longitude en float (avec gestion des erreurs)
    try:
        latitude = float(row["latitude"])
        longitude = float(row["longitude"])
    except (ValueError, TypeError):
        latitude, longitude = 0.0, 0.0  # Valeurs par défaut

    data_to_insert.append((
        service_name, address, postal_code,
        category, original_category, insee_code,
        latitude, longitude
    ))

# 8. Insertion par lots (plus efficace)
insert_query = """
INSERT INTO data_services (
    service_name, address, postal_code,
    category, original_category, insee_code,
    latitude, longitude
)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s)
ON DUPLICATE KEY UPDATE
    service_name = VALUES(service_name),
    address = VALUES(address),
    postal_code = VALUES(postal_code),
    category = VALUES(category),
    original_category = VALUES(original_category),
    latitude = VALUES(latitude),
    longitude = VALUES(longitude)
"""

# Exécuter l'insertion avec une barre de progression
for i in tqdm(range(0, len(data_to_insert), 1000), desc="Insertion en cours"):
    batch = data_to_insert[i:i+1000]
    cursor.executemany(insert_query, batch)
    connection.commit()

# Fermer la connexion
connection.close()
print("Import terminé avec succès !")
