-- ================================================================
-- TEST DE SUPPRESSION SÉLECTIVE DES VIREMENTS
-- ================================================================
-- Ce script teste que la suppression d'un virement ne supprime
-- QUE son jumeau exact, pas les autres virements entre ces comptes
-- ================================================================

-- ================================================================
-- 1) CRÉATION DE DONNÉES DE TEST
-- ================================================================

-- Créer 3 virements entre les comptes 1 et 2
-- Virement A : 20 oct, 100€, "Épargne mensuelle"
INSERT INTO bank (id_bank, transfer_id, date, description, debit, credit, id_copro, exercice, pointed)
VALUES 
    (1, 2, '2025-10-20', 'Épargne mensuelle', 100.00, NULL, 1, 1, 0),
    (2, 1, '2025-10-20', 'Épargne mensuelle', NULL, 100.00, 1, 1, 0);

-- Virement B : 20 oct, 50€, "Provision charges"
INSERT INTO bank (id_bank, transfer_id, date, description, debit, credit, id_copro, exercice, pointed)
VALUES 
    (1, 2, '2025-10-20', 'Provision charges', 50.00, NULL, 1, 1, 0),
    (2, 1, '2025-10-20', 'Provision charges', NULL, 50.00, 1, 1, 0);

-- Virement C : 21 oct, 100€, "Épargne mensuelle"
INSERT INTO bank (id_bank, transfer_id, date, description, debit, credit, id_copro, exercice, pointed)
VALUES 
    (1, 2, '2025-10-21', 'Épargne mensuelle', 100.00, NULL, 1, 1, 0),
    (2, 1, '2025-10-21', 'Épargne mensuelle', NULL, 100.00, 1, 1, 0);

-- Afficher tous les virements créés
SELECT 
    id,
    id_bank,
    transfer_id,
    date,
    description,
    debit,
    credit
FROM bank
WHERE transfer_id IS NOT NULL
ORDER BY date, id;

-- ================================================================
-- 2) TEST DE LA REQUÊTE DE RECHERCHE DU JUMEAU
-- ================================================================

-- Simuler la recherche du jumeau de l'opération avec id=X
-- (Remplacer X par l'ID réel de la première opération créée)

SET @op_id = (SELECT id FROM bank WHERE date='2025-10-20' AND description='Épargne mensuelle' AND debit=100.00 LIMIT 1);
SET @op_id_bank = (SELECT id_bank FROM bank WHERE id=@op_id);
SET @op_transfer_id = (SELECT transfer_id FROM bank WHERE id=@op_id);
SET @op_date = (SELECT date FROM bank WHERE id=@op_id);
SET @op_description = (SELECT description FROM bank WHERE id=@op_id);
SET @op_debit = (SELECT debit FROM bank WHERE id=@op_id);
SET @op_credit = (SELECT credit FROM bank WHERE id=@op_id);

-- Requête de recherche du jumeau (celle utilisée dans BankController.php)
SELECT 
    id,
    id_bank,
    transfer_id,
    date,
    description,
    debit,
    credit,
    '← JUMEAU TROUVÉ' as resultat
FROM bank 
WHERE id_bank = @op_transfer_id
  AND transfer_id = @op_id_bank
  AND DATE(date) = DATE(@op_date)
  AND description = @op_description
  AND ABS(COALESCE(debit, 0) - COALESCE(@op_credit, 0)) < 0.01
  AND ABS(COALESCE(credit, 0) - COALESCE(@op_debit, 0)) < 0.01
  AND id != @op_id
LIMIT 1;

-- Résultat attendu : UNE SEULE ligne (le jumeau du virement A)

-- ================================================================
-- 3) VÉRIFICATION : Combien de lignes seraient affectées ?
-- ================================================================

-- Sans les critères de sélectivité (DANGEREUX - trop large)
SELECT COUNT(*) as 'SANS_SELECTIVITE (MAUVAIS)'
FROM bank
WHERE id_bank = @op_transfer_id
  AND transfer_id = @op_id_bank;

-- Résultat attendu : 3 (TROP ! On supprimerait tous les virements)

-- Avec date uniquement
SELECT COUNT(*) as 'AVEC_DATE_SEULEMENT'
FROM bank
WHERE id_bank = @op_transfer_id
  AND transfer_id = @op_id_bank
  AND DATE(date) = DATE(@op_date);

-- Résultat attendu : 2 (ENCORE TROP !)

-- Avec date + montant
SELECT COUNT(*) as 'AVEC_DATE_ET_MONTANT'
FROM bank
WHERE id_bank = @op_transfer_id
  AND transfer_id = @op_id_bank
  AND DATE(date) = DATE(@op_date)
  AND ABS(COALESCE(debit, 0) - COALESCE(@op_credit, 0)) < 0.01
  AND ABS(COALESCE(credit, 0) - COALESCE(@op_debit, 0)) < 0.01;

-- Résultat attendu : 2 (ENCORE TROP ! Même date, même montant)

-- Avec date + montant + description (CORRECT)
SELECT COUNT(*) as 'AVEC_TOUS_LES_CRITERES (CORRECT)'
FROM bank
WHERE id_bank = @op_transfer_id
  AND transfer_id = @op_id_bank
  AND DATE(date) = DATE(@op_date)
  AND description = @op_description
  AND ABS(COALESCE(debit, 0) - COALESCE(@op_credit, 0)) < 0.01
  AND ABS(COALESCE(credit, 0) - COALESCE(@op_debit, 0)) < 0.01
  AND id != @op_id;

-- Résultat attendu : 1 (PARFAIT ! Un seul jumeau trouvé)

-- ================================================================
-- 4) SIMULATION DE SUPPRESSION
-- ================================================================

-- Afficher ce qui SERAIT supprimé
SELECT 
    id,
    date,
    description,
    debit,
    credit,
    'SERAIT SUPPRIMÉ' as action
FROM bank
WHERE id = @op_id
   OR (
       id_bank = @op_transfer_id
       AND transfer_id = @op_id_bank
       AND DATE(date) = DATE(@op_date)
       AND description = @op_description
       AND ABS(COALESCE(debit, 0) - COALESCE(@op_credit, 0)) < 0.01
       AND ABS(COALESCE(credit, 0) - COALESCE(@op_debit, 0)) < 0.01
       AND id != @op_id
   );

-- Résultat attendu : 2 lignes (l'opération + son jumeau)

-- Afficher ce qui SERAIT CONSERVÉ
SELECT 
    id,
    date,
    description,
    debit,
    credit,
    'SERAIT CONSERVÉ' as action
FROM bank
WHERE transfer_id IS NOT NULL
  AND id != @op_id
  AND id NOT IN (
      SELECT id FROM bank
      WHERE id_bank = @op_transfer_id
        AND transfer_id = @op_id_bank
        AND DATE(date) = DATE(@op_date)
        AND description = @op_description
        AND ABS(COALESCE(debit, 0) - COALESCE(@op_credit, 0)) < 0.01
        AND ABS(COALESCE(credit, 0) - COALESCE(@op_debit, 0)) < 0.01
        AND id != @op_id
  );

-- Résultat attendu : 4 lignes (virements B et C conservés)

-- ================================================================
-- 5) NETTOYAGE DES DONNÉES DE TEST
-- ================================================================

-- Supprimer les données de test créées
DELETE FROM bank 
WHERE date IN ('2025-10-20', '2025-10-21')
  AND description IN ('Épargne mensuelle', 'Provision charges')
  AND id_copro = 1;

SELECT 'Test terminé - données nettoyées' as resultat;

-- ================================================================
-- CONCLUSION
-- ================================================================

/*
Ce test démontre que la requête avec TOUS les critères est nécessaire :
- id_bank inversé
- transfer_id inversé  
- Date identique
- Description identique
- Montant inversé (débit/crédit)
- id différent (pas soi-même)

Sans TOUS ces critères, on risque de supprimer plusieurs virements au lieu d'un seul.

✅ CORRECT : 1 seul jumeau trouvé
❌ INCORRECT : 2+ jumeaux trouvés (suppression en cascade non voulue)
*/
