package com.example.boidelov3.games.game89;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

/**
 * Gère les défis du jeu 89++
 */
public class Game89ChallengeManager {
    private final Random random;
    private final List<Challenge> availableChallenges;
    private int currentIndex = 0;
    
    public Game89ChallengeManager() {
        this.random = new Random();
        this.availableChallenges = new ArrayList<>();
        initializeChallenges();
        shuffleChallenges();
    }
    
    /**
     * Mélange la liste des défis disponibles
     */
    private void shuffleChallenges() {
        Collections.shuffle(availableChallenges, random);
        currentIndex = 0;
    }
    
    /**
     * Initialise la liste des défis disponibles
     */
    private void initializeChallenges() {
        // Changer le sens
        availableChallenges.add(new Challenge(
            ChallengeType.REVERSE_DIRECTION,
            "Changement de sens !",
            "Le sens du jeu est inversé !"
        ));
        
        // Immunité
        availableChallenges.add(new Challenge(
            ChallengeType.IMMUNITY,
            "Immunité !",
            "Le joueur actuel est immunisé contre les gorgées pendant 5 minutes !"
        ));
        
        // Distribuer des gorgées
        availableChallenges.add(new Challenge(
            ChallengeType.DRINK_GORGEE,
            "Gorgée surprise !",
            "Le joueur actuel boit 3 gorgées !"
        ));
        
        // Joker : passer son tour
        availableChallenges.add(new Challenge(
            ChallengeType.SKIP_TURN,
            "Joker !",
            "Le joueur actuel passe son tour !"
        ));
        
        // Échange de main
        availableChallenges.add(new Challenge(
            ChallengeType.SWAP_HAND,
            "Échange de mains !",
            "Le joueur actuel échange sa main avec le joueur de son choix !"
        ));
        
        // Double prochaine valeur
        availableChallenges.add(new Challenge(
            ChallengeType.DOUBLE_NEXT,
            "Double !",
            "La prochaine carte jouée compte double !"
        ));
        
        // Compteur aléatoire
        availableChallenges.add(new Challenge(
            ChallengeType.RANDOM_COUNT,
            "Compte mystère !",
            "Ajoutez un nombre aléatoire entre 1 et 10 au compteur !"
        ));
        
        // Tout le monde boit
        availableChallenges.add(new Challenge(
            ChallengeType.EVERYONE_DRINKS,
            "Tour générale !",
            "Tout le monde boit 2 gorgées !"
        ));
        
        // Choisissez une victime
        availableChallenges.add(new Challenge(
            ChallengeType.PICK_VICTIM,
            "Victime !",
            "Le joueur actuel choisit quelqu'un qui boit 3 gorgées !"
        ));
    }
    
    /**
     * Retourne le prochain défi (sans répétition tant que tous n'ont pas été utilisés)
     */
    public Challenge getRandomChallenge() {
        if (availableChallenges.isEmpty()) {
            return null;
        }
        if (currentIndex >= availableChallenges.size()) {
            shuffleChallenges();
        }
        return availableChallenges.get(currentIndex++);
    }
    
    /**
     * Retourne la description d'un défi pour l'afficher
     */
    public static String getChallengeDisplay(Challenge challenge) {
        if (challenge == null) {
            return "";
        }
        return challenge.getTitle() + "\n" + challenge.getDescription();
    }
    
    /**
     * Classe représentant un défi
     */
    public static class Challenge {
        private final ChallengeType type;
        private final String title;
        private final String description;
        
        public Challenge(ChallengeType type, String title, String description) {
            this.type = type;
            this.title = title;
            this.description = description;
        }
        
        public ChallengeType getType() {
            return type;
        }
        
        public String getTitle() {
            return title;
        }
        
        public String getDescription() {
            return description;
        }
    }
    
    /**
     * Types de défis disponibles
     */
    public enum ChallengeType {
        REVERSE_DIRECTION,
        IMMUNITY,
        DRINK_GORGEE,
        SKIP_TURN,
        SWAP_HAND,
        DOUBLE_NEXT,
        RANDOM_COUNT,
        EVERYONE_DRINKS,
        PICK_VICTIM
    }
}
