package org.Views;

import org.Models.Jeu;
import org.Models.PieceCourante;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Insets;
import java.util.Observable;
import java.util.Observer;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;

@SuppressWarnings("deprecation")
public class VueBandeauControle extends JPanel implements Observer {
    private JLabel scoreLabel;
    private JPanel nextPiecePanel;
    private JButton pauseButton;
    private JButton aideButton;
    private JPanel[][] caseNextPiece = new JPanel[4][4];
    private JLabel nbLigneLabel;
    private JButton quitterButton;
    private Jeu jeu;
    private JButton relancerButton;

    /**
     * Crée une nouvelle instance de VueBandeauControle.
     * @param jeu
     */
    public VueBandeauControle(Jeu jeu) {
        this.jeu = jeu;
        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
        setBackground(Color.gray);
        // setPreferredSize();

        // SCORE
        scoreLabel = new JLabel("SCORE : " + jeu.getGrille().getScore());
        scoreLabel.setForeground(Color.white);
        scoreLabel.setFont(new Font("Arial", Font.PLAIN, 16));
        scoreLabel.setAlignmentX(Component.CENTER_ALIGNMENT);

        // NB LIGNE
        nbLigneLabel = new JLabel("LIGNES : " + jeu.getGrille().getNbLignesSupprimees());
        nbLigneLabel.setForeground(Color.white);
        nbLigneLabel.setFont(new Font("Arial", Font.PLAIN, 16));
        nbLigneLabel.setAlignmentX(Component.CENTER_ALIGNMENT);

        // NEXT PIECE
        nextPiecePanel = new JPanel();
        nextPiecePanel.setBackground(Color.LIGHT_GRAY);
        nextPiecePanel.setAlignmentX(Component.CENTER_ALIGNMENT);
        initierNextPiecePanel();

        // PAUSE BUTTON & QUIT BUTTON
        pauseButton = new JButton("PAUSE");
        quitterButton = new JButton("QUITTER");
        Dimension buttonSize = new Dimension(85, 30);
        Insets margeBoutton = new Insets(2, 2, 2, 2);
        pauseButton.setPreferredSize(buttonSize);
        pauseButton.setMargin(margeBoutton);
        quitterButton.setPreferredSize(buttonSize);
        quitterButton.setMargin(margeBoutton);
        JPanel hautBoutonsPanel = new JPanel();
        // boutonsPanel.setLayout(new BoxLayout(boutonsPanel, BoxLayout.X_AXIS));
        hautBoutonsPanel.setOpaque(false);
        hautBoutonsPanel.add(pauseButton);
        hautBoutonsPanel.add(Box.createRigidArea(new Dimension(10, 0)));
        hautBoutonsPanel.add(quitterButton);
        pauseButton.setFocusable(false);
        quitterButton.setFocusable(false);

        // Relancer button
        relancerButton = new JButton("RESTART");
        relancerButton.setPreferredSize(buttonSize);
        relancerButton.setMargin(margeBoutton);
        relancerButton.setFocusable(false);

        // AIDE BUTTON
        aideButton = new JButton("?");
        aideButton.setToolTipText("AFFICHER L'AIDE");
        aideButton.setPreferredSize(new Dimension(45, 20));
        aideButton.setFocusable(false);

        JPanel footerPanel = new JPanel(new BorderLayout());
        footerPanel.setMaximumSize(new Dimension(Integer.MAX_VALUE, 40));
        footerPanel.setOpaque(false);
        footerPanel.add(relancerButton, BorderLayout.WEST);
        footerPanel.add(aideButton, BorderLayout.EAST);

        add(Box.createVerticalStrut(20));
        add(scoreLabel);
        add(Box.createVerticalStrut(20));
        add(nbLigneLabel);
        add(Box.createVerticalStrut(20));
        add(nextPiecePanel);
        add(Box.createVerticalStrut(20));
        add(hautBoutonsPanel);
        add(Box.createVerticalGlue()); // force le JPanel à prendre toute la hauteur
        add(footerPanel);

        // setVisible(true);
        jeu.addObserver(this);
    }

    /**
     * Met à jour le score affiché dans le bandeau de contrôle.
     * @param score
     */
    public void setScore(int score) {
        scoreLabel.setText("Score: " + score);
    }

    /**
     * Récupère le bouton de pause.
     * @return
     */
    public JButton getPauseButton() {
        return pauseButton;
    }

    /**
     * Récupère le bouton de quitter.
     * @return
     */
    public JButton getQuitterButton() {
        return quitterButton;
    }

    /**
     * Récupère le panneau de la prochaine pièce.
     * @return
     */
    public JPanel getNextPiecePanel() {
        return nextPiecePanel;
    }

    /**
     * Récupère le bouton de relancer.
     * @return
     */
    private void initierNextPiecePanel() {
        nextPiecePanel.removeAll();
        nextPiecePanel.setLayout(new GridLayoutCarre(4, 4));
        Dimension tailleCarre = new Dimension(120, 120);
        nextPiecePanel.setPreferredSize(tailleCarre);
        nextPiecePanel.setMaximumSize(tailleCarre);
        nextPiecePanel.setMinimumSize(tailleCarre);
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                JPanel caseG = new JPanel();
                caseG.setBorder(BorderFactory.createLineBorder(Color.BLACK));
                caseG.setBackground(Color.WHITE);
                caseNextPiece[i][j] = caseG;
                nextPiecePanel.add(caseG);
            }
        }
        nextPiecePanel.revalidate();
        nextPiecePanel.repaint();
    }

    /**
     * Affiche la prochaine pièce dans le panneau de la prochaine pièce.
     * @param piece
     */
    public void afficherPieceSuivante(PieceCourante piece) {
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                caseNextPiece[i][j].setBackground(Color.WHITE);
            }
        }

        boolean[][] motif = piece.getMotif();
        for (int i = 0; i < motif.length; i++) {
            for (int j = 0; j < motif[i].length; j++) {
                if (motif[i][j]) {
                    caseNextPiece[i][j].setBackground(Color.RED);
                }
            }
        }

        nextPiecePanel.revalidate();
        nextPiecePanel.repaint();
    }

    /**
     * Récupère le bouton d'aide.
     * @return
     */
    public JButton getAideButton() {
        return aideButton;
    }

    /**
     * Récupère le bouton de relancer.
     * @return
     */
    public JButton getRelancerButton() {
        return relancerButton;
    }

    /**
     * Récupère le label du nombre de lignes.
     * @return
     */
    @Override
    public void update(Observable o, Object arg) {
        if (o instanceof Jeu) {
            afficherPieceSuivante(jeu.getPieceSuivante());
            setScore(jeu.getGrille().getScore());
            nbLigneLabel.setText("LIGNES : " + jeu.getGrille().getNbLignesSupprimees());
            scoreLabel.setText("SCORE : " + jeu.getGrille().getScore());
        }
    }
}