package fr.iutfbleau.projetAgile.Puissance4.View;

import javax.swing.*;
import fr.iutfbleau.projetAgile.Puissance4.Utils.Constants;
import java.awt.*;

/**
 * Classe qui représente uniquement la grille du puissance 4
 */
public class Grille extends JPanel{

    private Pion grille[][];
    private int column;
    private int row;
    private Pion lastHoveredPion;

    /**
     * Crée un grille vide
     */
    public Grille() {
        super();
    }

    /**
     * Initialise la grille avec le panneau donné en argument
     * @param tab le tableau contenant la position des pions de chaque joueur
     */
    public void init(int[][] tab) {
        this.column = Constants.COLUMN_COUNT;
        this.row = Constants.ROW_COUNT;
        this.grille = new Pion[this.column][this.row];
        this.lastHoveredPion = null;
        this.setBackground(new Color(31,31,31));
        /*
         * On peut remplacer GridBagLayout par un GridLayout
         */
        GridBagLayout gbl = new GridBagLayout();
        this.setLayout(gbl);
        GridBagConstraints gbc = new GridBagConstraints();
        for (int x = 0; x < this.column; x++) {
            for (int y = 0; y < this.row; y++) {
                Pion pion = new Pion(tab[x][y]);
                gbc.gridx = x;
                gbc.gridy = y;
                gbc.fill = GridBagConstraints.BOTH;
                gbc.anchor = GridBagConstraints.CENTER;
                gbc.gridwidth = 1;
                gbc.gridheight = 1;
                gbc.weightx = 0;
                gbc.weighty = 0;
                gbc.insets = new Insets(0, 0, 0, 0);

                this.add(pion, gbc);

                grille[x][y] = pion;
            }
        }
    }

    /**
     * Change le propriétaire d'un pion et le redessine
     * @param column la colonne du pion a changer
     * @param row la ligne du pion a changer
     * @param player le joueur
     */
    public void addPlayerPiece(int column, int row, int player) {
        this.grille[column][row].setPlayer(player);
        this.grille[column][row].repaint();
    }
    
    /**
     * Réinitialise la grille et la rempli de pion "vide"
     */
    public void reset() {
        for (int x = 0; x < this.column; x++) {
            for (int y = 0; y < this.row; y++) {
                this.grille[x][y].setPlayer(Constants.EMPTY_PLAYER);
                this.grille[x][y].setHover(false);
            }
        }
        this.repaint();
    }

    public void RemovePlayer(int Joueur, int[][] j){
        for (int x = 0; x < this.column; x++) {
            for (int y = 0; y < this.row; y++) {
                this.grille[x][y].setPlayer(j[x][y]);
                this.grille[x][y].setHover(false);
            }
        }
        this.repaint();
    }

    

    /**
     * Change la couleur de survol des pions selon le tour du joueur
     * @param player le joueur qui joue
     */
    public void changeHoverColor(int player) {
        Color c;
        switch(player) {
            case Constants.PLAYER_ONE :
                c = new Color(Constants.PLAYER_ONE_COLOR.getRed(), Constants.PLAYER_ONE_COLOR.getGreen(), Constants.PLAYER_ONE_COLOR.getBlue(), 100);
                break;
            case Constants.PLAYER_TWO : 
                c = new Color(Constants.PLAYER_TWO_COLOR.getRed(), Constants.PLAYER_TWO_COLOR.getGreen(), Constants.PLAYER_TWO_COLOR.getBlue(), 100);
                break;
            case Constants.PLAYER_THREE :
                c = new Color(Constants.PLAYER_THREE_COLOR.getRed(), Constants.PLAYER_THREE_COLOR.getGreen(), Constants.PLAYER_THREE_COLOR.getBlue(), 100);
                break;
            default : 
                c = Color.BLACK;
        }
        Pion.setHighlightColor(c);
    }

    /**
     * Sélectionne le pion qui doit être afficher comme survolé selon la colonne
     * @param column la colonne survolé
     */
    public void hover(int column) {
        if(column == -1) {
            if(this.lastHoveredPion != null) {
                this.lastHoveredPion.setHover(false);
                this.lastHoveredPion.repaint();
                this.lastHoveredPion = null;
            }
        }
        else {
            for(int y = row - 1; y >= 0; y--) { 
                if(this.grille[column][y].getPlayer() == Constants.EMPTY_PLAYER) {
                    if(this.grille[column][y] != this.lastHoveredPion) {
                        if(this.lastHoveredPion != null) {
                            this.lastHoveredPion.setHover(false);
                            this.lastHoveredPion.repaint();
                        }
                        this.lastHoveredPion = this.grille[column][y];
                        this.lastHoveredPion.setHover(true);
                        this.lastHoveredPion.repaint();
                        
                    }
                    break;
                }
                else if (y == 0 && this.grille[column][y] == this.lastHoveredPion) { //Dernier pion de la colonne ne doit plus être survolé
                    this.lastHoveredPion.setHover(false); 
                    this.lastHoveredPion.repaint();
                }
            }
        }
    }

    public void removePlayerPion(int Joueur){
        
    }
}   