package org.Controllers;

import org.Models.Grille;
import org.Models.Jeu;
import org.Models.Musique;
import org.Views.VueBandeauControle;

import javax.swing.*;

/**
 * Contrôleur pour le bandeau de contrôle du jeu Tetris.
 * Gère les actions des boutons (pause, quitter, aide, relancer) et l'état de la partie.
 */
public class TetrisBandeauControleur {
    private boolean partieEnPause = false;
    private boolean partieTerminee = false;
    private Musique musique;
    private VueBandeauControle vueControle;
    private Grille grille;
    private Jeu jeu;

    /**
     * Crée un contrôleur pour le bandeau de contrôle.
     *
     * @param vueControle la vue du bandeau de contrôle
     * @param musique le gestionnaire de musique
     * @param grille la grille de jeu
     * @param jeu l'instance du jeu
     */
    public TetrisBandeauControleur(VueBandeauControle vueControle, Musique musique, Grille grille, Jeu jeu) {
        this.vueControle = vueControle;
        this.musique = musique;
        this.grille = grille;
        this.jeu = jeu;
        // action play/pause
        // Listener pour le bouton play/pause
        this.vueControle.getPauseButton().addActionListener(e -> switchPlayPause());
        // Listener pour le bouton quitter
        this.vueControle.getQuitterButton().addActionListener(e -> {
            System.out.println("Fermeture de l'application...");
            System.exit(0);
        });
        // Listener pour le bouton aide
        this.vueControle.getAideButton().addActionListener(e -> afficherAide());
        // Listener pour le bouton recommencer
        this.vueControle.getRelancerButton().addActionListener(e -> {
            this.jeu.reinitialiserPartie();
            vueControle.getPauseButton().setText("PAUSE");
            partieEnPause = false;
            partieTerminee = false;
        });
    }

    /**
     * Bascule l'état de la partie entre pause et reprise.
     * Met à jour la grille, la musique et le texte du bouton pause.
     */
    public void switchPlayPause() {
        if (partieTerminee) {
            return;
        }
        partieEnPause = !partieEnPause;
        grille.setEnPause(partieEnPause);
        grille.setEnPause(partieEnPause);
        musique.basculePlayPause();
        vueControle.getPauseButton().setText(partieEnPause ? "PLAY" : "PAUSE");
        System.out.println(partieEnPause ? "Partie en pause" : "Partie en cours");
    }

    /**
     * Affiche une page d'aide avec les commandes du jeu.
     * Met la partie en pause pendant l'affichage de l'aide.
     */
    public void afficherAide() {
        String messageAide = "Utilisez les flèches du clavier pour déplacer la pièce courante :\n" +
                "Flèche gauche : Déplacer à gauche\n" +
                "Flèche droite : Déplacer à droite\n" +
                "Flèche bas : Accélérer la chute\n" +
                "R : Faire pivoter la pièce sens horaire\n" +
                "E : Faire pivoter la pièce sens anti horaire\n" +
                "Espace : Hard drop\n";
        if (!grille.estEnPause()) {
            grille.setEnPause(true);
            musique.basculePlayPause();
            JOptionPane.showMessageDialog(vueControle, messageAide, "Aide", JOptionPane.INFORMATION_MESSAGE);
            grille.setEnPause(false);
            musique.basculePlayPause();
        }
    }

}
