package fr.iutfbleau.projetAgile.Puissance4.Controller;

import javax.swing.JOptionPane;
import javax.swing.JPanel;

import java.awt.event.ActionListener;
import fr.iutfbleau.projetAgile.Puissance4.Model.GrilleModel;
import fr.iutfbleau.projetAgile.Puissance4.Utils.GameStatus;
import fr.iutfbleau.projetAgile.Puissance4.View.Grille;
import fr.iutfbleau.projetAgile.Puissance4.View.Puissance4Panel;

public class Puissance4Controller {
    private Grille grille;
    private GrilleModel modele;
    private Puissance4Panel panel;
    /**
     * Controleur du jeu, il initialise la vue, les listeners, etc..
     * @param grille La grille
     * @param modele Le modèle
     */
    public Puissance4Controller(Grille grille, GrilleModel modele) {
        this.modele = modele;
        this.grille = grille;
    
        ResetGame resetListener = new ResetGame(this);
        GrilleMouseListener mouseListener = new GrilleMouseListener(this);

        //Initialisation de la grille
        this.grille.init(modele.getTab());
        this.grille.addMouseListener(mouseListener);
        this.grille.addMouseMotionListener(mouseListener);

        //Initialisation du panneau avec la grille, les boutons, etc
        this.panel = new Puissance4Panel(this.grille);
        this.panel.resetButton(resetListener);
        ModelEventListener modelListener = new ModelEventListener(panel);
        //Ajout listener au modèle
        this.modele.addGridListener(modelListener);
    }

    /**
     * Initialise la vue, doit être appelé après avoir configuré le modèle (nom des joueurs)
     * @see fr.iutfbleau.projetAgile.Puissance4.Controller.Puissance4Controller#changeName(String, String)
     */
    public void initPanel() {
        this.panel.init();
        this.panel.setPlayerNumber(this.modele.getPlayerNumber());
        this.panel.changeHoverColor(this.modele.getPlayerTurn());
        this.panel.changeLabel(this.modele.getPlayerTurn());
        this.panel.changeScore(this.modele.getPlayerOneScore(), this.modele.getPlayerTwoScore(), this.modele.getPlayerThreeScore());
    }

    /**
     * Réinitialise la partie :
     *  - le status de la partie (en PLAYING)
     *  - la grille du modèle
     *  - la vue
     */
    public void reset() {
        if(this.modele.getGameStatus() == GameStatus.PLAYING) {
            int confirmation = JOptionPane.showConfirmDialog(this.panel, "Une partie est en cours ! Etes-vous sûr de vouloir recommencer ?", "Recommencer", JOptionPane.YES_NO_OPTION);
            if(confirmation == 1) return;
        }
        this.grille.reset();
        this.modele.reset();
        if(this.modele.getPlayerThreeName() != null) {
            this.modele.setPlayerNumber(3);
            this.panel.setPlayerNumber(3);
        }
        this.panel.changeHoverColor(this.modele.getPlayerTurn());
        this.panel.changeLabel(this.modele.getPlayerTurn());
    }

    /**
     * Vérifie si un pion peut-être placé dans la colonne
     * @param x la position de la souris lors du clic
     * @see fr.iutfbleau.projetAgile.Puissance4.Model.GrilleModel#verifyColumn(int)
     */
    public void verifyColumn(int x) {
        if(this.modele.getGameStatus() == GameStatus.PLAYING) {
            int column = (x * this.modele.getColumn() / grille.getWidth());
            this.modele.verifyColumn(column);
        }  
    }

    /**
     * Affiche le survol de la grille
     * @param x la position x de la souris sur la grille
     * Si x est égal à -1 efface le survol
     */
    public void hoverGrille(int x) {
        if(this.modele.getGameStatus() == GameStatus.PLAYING) {
            if(x == -1) {
                this.grille.hover(-1); //Clean
                return;
            }
            int column = (x * this.modele.getColumn() / grille.getWidth());
            this.grille.hover(column);
        }  
    }

    /**
     * Permet de récupérer le panneau du jeu
     * @return le panneau du jeu
     */
    public JPanel getPanel() {
        return this.panel;
    }

    /**
     * Ajoute un listener au bouton du panneau
     * @param l Le listener
     * @see fr.iutfbleau.projetAgile.Puissance4.View.Puissance4Panel#accueilButton(ActionListener)
     */
    public void accueilButton(ActionListener l){
        this.panel.accueilButton(l);
    }

    /**
     * Change le nom des joueurs dans le modèle et la vue
     * @param J1 le nom du joueur 1
     * @param J2 le nom du joueur 2
     */
    public void changeName(String J1, String J2) {
        this.modele.setPlayerOneName(J1);
        this.modele.setPlayerTwoName(J2);
        this.panel.setPlayerOneName(this.modele.getPlayerOneName());
        this.panel.setPlayerTwoName(this.modele.getPlayerTwoName());
    }

    /**
     * Change le nom des joueurs dans le modèle et la vue
     * @param J1 le nom du joueur 1
     * @param J2 le nom du joueur 2
     */
    public void changeName(String J1, String J2, String J3) {
        this.modele.setPlayerOneName(J1);
        this.modele.setPlayerTwoName(J2);
        this.modele.setPlayerThreeName(J3);
        this.panel.setPlayerOneName(this.modele.getPlayerOneName());
        this.panel.setPlayerTwoName(this.modele.getPlayerTwoName());
        this.panel.setPlayerThreeName(this.modele.getPlayerThreeName());
    }
}
