-- Script SQL pour désactiver temporairement la contrainte d'unicité sur l'INSEE de ville,
-- supprimer les doublons, et réactiver la contrainte

-- ATTENTION: Ce script supprime des enregistrements de la table stats.
-- Les entités liées (CityFollowUp, Place) seront également supprimées si des contraintes
-- de clé étrangère avec ON DELETE CASCADE sont définies dans la base de données.
-- Assurez-vous de faire une sauvegarde de la base de données avant d'exécuter ce script.

-- 1. Désactiver temporairement la contrainte d'unicité
ALTER TABLE stats DROP CONSTRAINT uniq_stats_zone;

-- 2. Identifier et supprimer les doublons, en gardant l'entrée la plus ancienne
-- Créer une table temporaire pour stocker les IDs à supprimer
CREATE TEMP TABLE stats_to_delete AS
WITH duplicates AS (
    SELECT 
        id,
        zone,
        date_created,
        ROW_NUMBER() OVER (
            PARTITION BY zone 
            ORDER BY 
                -- Garder l'entrée la plus ancienne si date_created existe
                CASE WHEN date_created IS NOT NULL THEN 0 ELSE 1 END,
                date_created,
                -- Si date_created est NULL, utiliser l'ID le plus petit (probablement le plus ancien)
                id
        ) AS row_num
    FROM stats
    WHERE zone IS NOT NULL
)
SELECT id FROM duplicates WHERE row_num > 1;

-- Afficher le nombre de doublons qui seront supprimés
SELECT COUNT(*) AS "Nombre de doublons à supprimer" FROM stats_to_delete;

-- Afficher les détails des doublons qui seront supprimés (pour vérification)
SELECT s.id, s.zone, s.name, s.date_created 
FROM stats s
JOIN stats_to_delete std ON s.id = std.id
ORDER BY s.zone, s.id;

-- 3. Supprimer les doublons
-- Note: Nous utilisons DELETE ... USING pour éviter les problèmes de contraintes de clé étrangère
DELETE FROM stats
USING stats_to_delete
WHERE stats.id = stats_to_delete.id;

-- 4. Nettoyer la table temporaire
DROP TABLE stats_to_delete;

-- 5. Réactiver la contrainte d'unicité
ALTER TABLE stats ADD CONSTRAINT uniq_stats_zone UNIQUE (zone);

-- 6. Vérifier qu'il n'y a plus de doublons
SELECT zone, COUNT(*) 
FROM stats 
WHERE zone IS NOT NULL 
GROUP BY zone 
HAVING COUNT(*) > 1;
