package fr.iutfbleau.projetAgile.Puissance4.Event;

import javax.swing.event.EventListenerList;
import fr.iutfbleau.projetAgile.Puissance4.Utils.GameStatus;

/**
 * Classe abstraite qui factorise les fonctions pour la classe observé (Initiater)
 */
public abstract class AbstractGridInitiater {
    
    protected EventListenerList listeners = new EventListenerList();

    /**
     * Ajoute le listener donné en argument à la liste des listes
     * @param listener Le listener a ajouté
     */
    public void addGridListener(GridChangedListener listener) {
        listeners.add(GridChangedListener.class, listener);
    }
    
    /**
     * Supprime le listener donné en argument de la liste des listeners
     * @param listener Le listener a supprimer
     */
    public void removeGridListener(GridChangedListener listener) {
        listeners.remove(GridChangedListener.class, listener);
    }
    
    /***
     * Retourne un tableau de tous les listeners
     * @return Le tableau de listeners
     */
    public GridChangedListener[] getGridListeners() {
        return listeners.getListeners(GridChangedListener.class);
    }

    /**
     * Notifie tous les listeners lorsque la grille est modifié
     * @param column la colonne modifié
     * @param row la ligne modifié
     * @param player le joueur qui a joué
     */
    protected void fireGridChanged(int column, int row, int player) {
        GridEvent event = null;
        for(GridChangedListener listener : getGridListeners()) {
            if(event == null)
                event = new GridEvent(column, row, player);
            listener.gridChanged(event);
        }
    }

    /**
     * Notifie tous les listeners lorsque le status du jeu change
     * @param status Le nouveau status
     * @param playerTurn Le tour du joueur
     * @param playerOneScore Le score du joueur 1
     * @param playerTwoScore Le score du joueur 2
     * @param playerThreeScore Le score du joueur 3
    */
    protected void fireStatusChanged(GameStatus status, int playerTurn, int playerOneScore, int playerTwoScore, int playerThreeScore) {
        StatusEvent event = null;
        for(GridChangedListener listener : getGridListeners()) {
            if(event == null)
                event = new StatusEvent(status, playerTurn, playerOneScore, playerTwoScore, playerThreeScore);
            listener.statusChanged(event);
        }
    }

    /**
     * Notifie tous les listeners lorsqu'un joueur gagne (supérieur à 2 joueurs)
     * @param playerRemove le joueur qui a gagné
    */
    protected void firePlayerWin(int playerRemove){
        PlayerEvent event=null;
        for(GridChangedListener listener : getGridListeners()) {
            if(event == null)
                event= new PlayerEvent(playerRemove);
            listener.playerWin(event);
        }
    }
}
