-- =============================================
-- CORRECTION DU PROBLÈME DE STATUT
-- =============================================
-- Résout l'erreur : SQLSTATE(01000): Warning : 1265 
-- Data truncated for column 'status' at row 1

USE tournament_db;

-- =============================================
-- ÉTAPE 1 : Sauvegarder les données actuelles
-- =============================================
SELECT '=== SAUVEGARDE DES DONNÉES ===' as info;
CREATE TABLE IF NOT EXISTS participants_backup AS SELECT * FROM participants;
SELECT 'Sauvegarde créée dans participants_backup' as info;

-- =============================================
-- ÉTAPE 2 : Supprimer les triggers temporairement
-- =============================================
SELECT '=== SUPPRESSION TEMPORAIRE DES TRIGGERS ===' as info;
DROP TRIGGER IF EXISTS before_participant_insert;
DROP TRIGGER IF EXISTS after_participant_delete;
DROP TRIGGER IF EXISTS after_participant_status_update;
SELECT 'Triggers supprimés' as info;

-- =============================================
-- ÉTAPE 3 : Modifier la colonne status
-- =============================================
SELECT '=== MODIFICATION DE LA COLONNE STATUS ===' as info;

-- Mettre à jour les valeurs existantes problématiques
UPDATE participants 
SET status = 'attente' 
WHERE status = 'Liste d\'attente' OR status LIKE '%attente%';

-- Modifier l'ENUM avec des valeurs simples (sans apostrophe)
ALTER TABLE participants 
MODIFY COLUMN status ENUM('en_lice', 'elimine', 'attente') 
DEFAULT 'en_lice' 
NOT NULL;

SELECT 'Colonne status modifiée avec succès' as info;

-- Convertir les anciennes valeurs vers les nouvelles
UPDATE participants SET status = 'en_lice' WHERE status = 'En lice';
UPDATE participants SET status = 'elimine' WHERE status = 'Éliminé';

-- =============================================
-- ÉTAPE 4 : Ajouter la colonne age si elle n'existe pas
-- =============================================
SELECT '=== AJOUT COLONNE AGE ===' as info;

SET @col_exists = 0;
SELECT COUNT(*) INTO @col_exists 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_SCHEMA = 'tournament_db' 
AND TABLE_NAME = 'participants' 
AND COLUMN_NAME = 'age';

SET @sql = IF(@col_exists = 0,
    'ALTER TABLE participants ADD COLUMN age INT NOT NULL DEFAULT 18 AFTER name',
    'SELECT "Colonne age existe déjà" as info'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

-- Mettre à jour l'âge des participants existants (valeur par défaut)
UPDATE participants SET age = 18 WHERE age IS NULL OR age = 0;

SELECT 'Colonne age configurée' as info;

-- =============================================
-- ÉTAPE 5 : Vérifier/Ajouter colonnes manquantes
-- =============================================
SELECT '=== VÉRIFICATION DES COLONNES ===' as info;

-- Prénom
SET @col_exists = 0;
SELECT COUNT(*) INTO @col_exists 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_SCHEMA = 'tournament_db' 
AND TABLE_NAME = 'participants' 
AND COLUMN_NAME = 'prenom';

SET @sql = IF(@col_exists = 0,
    'ALTER TABLE participants ADD COLUMN prenom VARCHAR(100) NOT NULL DEFAULT "" AFTER name',
    'SELECT "Colonne prenom existe déjà" as info'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

-- Nom de famille
SET @col_exists = 0;
SELECT COUNT(*) INTO @col_exists 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_SCHEMA = 'tournament_db' 
AND TABLE_NAME = 'participants' 
AND COLUMN_NAME = 'nom';

SET @sql = IF(@col_exists = 0,
    'ALTER TABLE participants ADD COLUMN nom VARCHAR(100) NOT NULL DEFAULT "" AFTER prenom',
    'SELECT "Colonne nom existe déjà" as info'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

-- Téléphone
SET @col_exists = 0;
SELECT COUNT(*) INTO @col_exists 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_SCHEMA = 'tournament_db' 
AND TABLE_NAME = 'participants' 
AND COLUMN_NAME = 'telephone';

SET @sql = IF(@col_exists = 0,
    'ALTER TABLE participants ADD COLUMN telephone VARCHAR(20) NULL AFTER nom',
    'SELECT "Colonne telephone existe déjà" as info'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

-- Position attente
SET @col_exists = 0;
SELECT COUNT(*) INTO @col_exists 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_SCHEMA = 'tournament_db' 
AND TABLE_NAME = 'participants' 
AND COLUMN_NAME = 'position_attente';

SET @sql = IF(@col_exists = 0,
    'ALTER TABLE participants ADD COLUMN position_attente INT NULL AFTER inscription_date',
    'SELECT "Colonne position_attente existe déjà" as info'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SELECT 'Toutes les colonnes sont présentes' as info;

-- =============================================
-- ÉTAPE 6 : Recréer les triggers avec les nouvelles valeurs
-- =============================================
SELECT '=== CRÉATION DES NOUVEAUX TRIGGERS ===' as info;

DELIMITER $$

-- Trigger pour l'insertion
CREATE TRIGGER before_participant_insert
BEFORE INSERT ON participants
FOR EACH ROW
BEGIN
    DECLARE current_count INT;
    DECLARE max_count INT;
    DECLARE min_age INT;
    
    -- Récupérer les paramètres du tournoi
    SELECT max_participants, age_minimum INTO max_count, min_age
    FROM tournaments
    WHERE id = NEW.tournament_id;
    
    -- Vérifier l'âge minimum
    IF NEW.age < min_age THEN
        SIGNAL SQLSTATE '45000'
        SET MESSAGE_TEXT = 'Âge minimum non atteint pour ce tournoi';
    END IF;
    
    -- Récupérer le nombre actuel de participants "en_lice"
    SELECT COUNT(*) INTO current_count
    FROM participants
    WHERE tournament_id = NEW.tournament_id
    AND status = 'en_lice';
    
    -- Si le tournoi est complet, mettre en liste d'attente
    IF current_count >= max_count THEN
        SET NEW.status = 'attente';
        
        -- Calculer la position dans la file d'attente
        SELECT COALESCE(MAX(position_attente), 0) + 1 INTO NEW.position_attente
        FROM participants
        WHERE tournament_id = NEW.tournament_id
        AND status = 'attente';
    ELSE
        SET NEW.status = 'en_lice';
        SET NEW.position_attente = NULL;
    END IF;
END$$

-- Trigger après suppression (promotion automatique)
CREATE TRIGGER after_participant_delete
AFTER DELETE ON participants
FOR EACH ROW
BEGIN
    -- Si c'était un participant "en_lice", promouvoir le premier de la liste
    IF OLD.status = 'en_lice' THEN
        UPDATE participants
        SET status = 'en_lice', position_attente = NULL
        WHERE tournament_id = OLD.tournament_id
        AND status = 'attente'
        ORDER BY position_attente ASC
        LIMIT 1;
        
        -- Réorganiser les positions dans la file d'attente
        SET @pos = 0;
        UPDATE participants
        SET position_attente = (@pos := @pos + 1)
        WHERE tournament_id = OLD.tournament_id
        AND status = 'attente'
        ORDER BY inscription_date ASC;
    END IF;
END$$

-- Trigger après mise à jour du statut (promotion si passage à "elimine")
CREATE TRIGGER after_participant_status_update
AFTER UPDATE ON participants
FOR EACH ROW
BEGIN
    DECLARE current_count INT;
    DECLARE max_count INT;
    
    -- Si un joueur passe de "en_lice" à "elimine"
    IF OLD.status = 'en_lice' AND NEW.status = 'elimine' THEN
        
        -- Vérifier s'il y a de la place
        SELECT COUNT(*), t.max_participants INTO current_count, max_count
        FROM participants p
        JOIN tournaments t ON p.tournament_id = t.id
        WHERE p.tournament_id = NEW.tournament_id
        AND p.status = 'en_lice'
        GROUP BY t.max_participants;
        
        -- Si place disponible, promouvoir le premier en attente
        IF current_count < max_count THEN
            UPDATE participants
            SET status = 'en_lice', position_attente = NULL
            WHERE tournament_id = NEW.tournament_id
            AND status = 'attente'
            ORDER BY position_attente ASC
            LIMIT 1;
            
            -- Réorganiser les positions
            SET @pos = 0;
            UPDATE participants
            SET position_attente = (@pos := @pos + 1)
            WHERE tournament_id = NEW.tournament_id
            AND status = 'attente'
            ORDER BY inscription_date ASC;
        END IF;
    END IF;
END$$

DELIMITER ;

SELECT 'Triggers recréés avec succès' as info;

-- =============================================
-- ÉTAPE 7 : Réorganiser les listes d'attente existantes
-- =============================================
SELECT '=== RÉORGANISATION DES LISTES D\'ATTENTE ===' as info;

SET @pos = 0;
UPDATE participants
SET position_attente = (@pos := @pos + 1)
WHERE status = 'attente'
ORDER BY tournament_id, inscription_date ASC;

SELECT 'Listes d\'attente réorganisées' as info;

-- =============================================
-- ÉTAPE 8 : Vérification finale
-- =============================================
SELECT '=== VÉRIFICATION FINALE ===' as info;

SELECT 
    'Structure de la table participants' as info,
    COLUMN_NAME as colonne,
    COLUMN_TYPE as type,
    IS_NULLABLE as nullable,
    COLUMN_DEFAULT as defaut
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'tournament_db'
AND TABLE_NAME = 'participants'
ORDER BY ORDINAL_POSITION;

SELECT '' as '';

SELECT 'Répartition des statuts :' as info;
SELECT 
    status,
    COUNT(*) as nombre
FROM participants
GROUP BY status;

SELECT '' as '';

-- =============================================
-- RÉSUMÉ DES MODIFICATIONS
-- =============================================
SELECT '========================================' as '';
SELECT '✅ CORRECTION COMPLÈTE TERMINÉE !' as '';
SELECT '========================================' as '';
SELECT '' as '';
SELECT 'Modifications effectuées :' as info;
SELECT '  1. Statuts simplifiés : en_lice, elimine, attente' as '';
SELECT '  2. Colonne age ajoutée' as '';
SELECT '  3. Colonnes prenom, nom, telephone ajoutées' as '';
SELECT '  4. Triggers mis à jour' as '';
SELECT '  5. Listes d\'attente réorganisées' as '';
SELECT '' as '';
SELECT 'Nouveaux statuts à utiliser :' as info;
SELECT '  - en_lice (au lieu de "En lice")' as '';
SELECT '  - elimine (au lieu de "Éliminé")' as '';
SELECT '  - attente (au lieu de "Liste d\'attente")' as '';
SELECT '' as '';
SELECT '⚠️  IMPORTANT : Mettre à jour le code PHP !' as '';
SELECT '========================================' as '';
