-- ============================================================================
-- REFACTORISATION : Plan comptable mutualisé
-- ============================================================================
-- Objectif : Un seul plan comptable pour toutes les copros
-- Sécurité : Séparation des données par ecritures_comptables.id_copro
-- Exception : 401XXX et 450XXX restent liés à id_copro (tiers spécifiques)
-- ============================================================================

-- ÉTAPE 1 : Diagnostic initial
-- ============================================================================
SELECT '=== DIAGNOSTIC INITIAL ===' as etape;

-- Compter les comptes généraux dupliqués
SELECT 
    COUNT(*) as total_comptes,
    COUNT(DISTINCT numero_compte) as comptes_uniques,
    COUNT(*) - COUNT(DISTINCT numero_compte) as duplicatas
FROM plan_comptable
WHERE numero_compte NOT LIKE '401%' 
  AND numero_compte NOT LIKE '450%';

-- Lister les comptes dupliqués par copro
SELECT 
    numero_compte,
    COUNT(DISTINCT id_copro) as nb_copros,
    GROUP_CONCAT(DISTINCT id_copro ORDER BY id_copro) as copros
FROM plan_comptable
WHERE numero_compte NOT LIKE '401%' 
  AND numero_compte NOT LIKE '450%'
  AND id_copro IS NOT NULL
GROUP BY numero_compte
HAVING COUNT(DISTINCT id_copro) > 1
ORDER BY numero_compte;

-- ÉTAPE 2 : Backup des données actuelles
-- ============================================================================
SELECT '=== BACKUP ===' as etape;

CREATE TABLE IF NOT EXISTS plan_comptable_backup_20251023 AS 
SELECT * FROM plan_comptable;

-- Vérifier le backup
SELECT COUNT(*) as nb_lignes_backupees FROM plan_comptable_backup_20251023;

-- ÉTAPE 2.5 : Modifier la structure de la table pour autoriser id_copro = NULL
-- ============================================================================
SELECT '=== MODIFICATION STRUCTURE ===' as etape;

-- Autoriser id_copro à être NULL
ALTER TABLE plan_comptable 
MODIFY COLUMN id_copro INT NULL;

-- Vérifier la modification
SHOW COLUMNS FROM plan_comptable LIKE 'id_copro';

-- ÉTAPE 3 : Supprimer les comptes généraux dupliqués
-- ============================================================================
SELECT '=== NETTOYAGE DES DUPLICATAS ===' as etape;

-- Conserver uniquement la version avec id_copro = 1 (template)
-- Supprimer les autres versions (id_copro = 2, 34, 35, etc.)
DELETE FROM plan_comptable
WHERE numero_compte NOT LIKE '401%'
  AND numero_compte NOT LIKE '450%'
  AND numero_compte NOT LIKE '512%'
  AND id_copro IS NOT NULL
  AND id_copro != 1;

SELECT ROW_COUNT() as comptes_supprimes;

-- ÉTAPE 4 : Transformer les comptes généraux en comptes mutualisés
-- ============================================================================
SELECT '=== MUTUALISATION ===' as etape;

-- Mettre id_copro = NULL pour tous les comptes généraux
-- (sauf 401XXX, 450XXX et 512XXX-X qui restent liés aux copros)
UPDATE plan_comptable
SET id_copro = NULL,
    id_entite = NULL,
    type_entite = NULL
WHERE numero_compte NOT LIKE '401%'
  AND numero_compte NOT LIKE '450%'
  AND numero_compte NOT LIKE '512%'
  AND id_copro = 1;

SELECT ROW_COUNT() as comptes_mutualises;

-- ÉTAPE 5 : Vérification finale
-- ============================================================================
SELECT '=== VERIFICATION FINALE ===' as etape;

-- Compter les comptes par type
SELECT 
    type_compte,
    COUNT(*) as nb_comptes,
    COUNT(DISTINCT id_copro) as nb_copros_differentes,
    statut
FROM (
    SELECT 
        CASE 
            WHEN numero_compte LIKE '401%' THEN 'Fournisseurs (401XXX)'
            WHEN numero_compte LIKE '450%' THEN 'Copropriétaires (450XXX)'
            WHEN numero_compte LIKE '512%' THEN 'Banques (512XXX)'
            WHEN numero_compte LIKE '706%' THEN 'Appels de fonds (706XXX)'
            WHEN numero_compte LIKE '628%' THEN 'Charges externes (628XXX)'
            ELSE CONCAT('Classe ', LEFT(numero_compte, 1))
        END as type_compte,
        CASE 
            WHEN id_copro IS NULL THEN 'MUTUALISÉ'
            ELSE 'SPÉCIFIQUE'
        END as statut,
        id_copro
    FROM plan_comptable
) AS comptes_classifies
GROUP BY type_compte, statut
ORDER BY type_compte, statut;

-- Vérifier les comptes principaux
SELECT 
    numero_compte,
    libelle,
    id_copro,
    CASE 
        WHEN id_copro IS NULL THEN '✅ MUTUALISÉ'
        ELSE CONCAT('⚠️ Spécifique copro ', id_copro)
    END as statut
FROM plan_comptable
WHERE numero_compte IN ('706001', '706002', '628000', '791000', '512001')
ORDER BY numero_compte;

-- Vérifier qu'il n'y a pas de comptes orphelins
SELECT 
    l.numero_compte,
    COUNT(DISTINCT e.id_copro) as nb_copros_utilisatrices,
    GROUP_CONCAT(DISTINCT e.id_copro) as copros,
    MAX(p.id) as plan_comptable_id,
    MAX(p.libelle) as libelle
FROM lignes_ecritures l
INNER JOIN ecritures_comptables e ON l.id_ecriture = e.id
LEFT JOIN plan_comptable p ON l.numero_compte = p.numero_compte 
    AND (p.id_copro IS NULL OR p.id_copro = e.id_copro)
WHERE l.numero_compte NOT LIKE '401%'
  AND l.numero_compte NOT LIKE '450%'
GROUP BY l.numero_compte
HAVING MAX(p.id) IS NULL
ORDER BY l.numero_compte;

-- ÉTAPE 6 : Statistiques finales
-- ============================================================================
SELECT '=== STATISTIQUES FINALES ===' as etape;

SELECT 
    'Comptes généraux mutualisés' as categorie,
    COUNT(*) as total
FROM plan_comptable
WHERE id_copro IS NULL
UNION ALL
SELECT 
    'Fournisseurs (401XXX) spécifiques' as categorie,
    COUNT(*) as total
FROM plan_comptable
WHERE numero_compte LIKE '401%'
UNION ALL
SELECT 
    'Copropriétaires (450XXX) spécifiques' as categorie,
    COUNT(*) as total
FROM plan_comptable
WHERE numero_compte LIKE '450%'
UNION ALL
SELECT 
    'TOTAL' as categorie,
    COUNT(*) as total
FROM plan_comptable;

-- ============================================================================
-- ROLLBACK EN CAS DE PROBLÈME
-- ============================================================================
-- Si besoin de revenir en arrière :
-- DROP TABLE plan_comptable;
-- CREATE TABLE plan_comptable AS SELECT * FROM plan_comptable_backup_20251023;
-- ============================================================================
