import javax.swing.*;
import java.awt.*;

/**
 * La classe abstraite SudokuUI est une interface graphique pour afficher et interagir avec une grille de Sudoku.
 * Elle fournit les méthodes de base pour la création de l'interface utilisateur.
 */
public abstract class SudokuUI extends JFrame {
    
    /**
     * La grille de Sudoku associée à l'interface utilisateur.
     */
    protected Sudoku sudoku;
    
    /**
     * Tableau bidimensionnel de boutons représentant les cellules de la grille de Sudoku.
     */
    protected JButton[][] buttons;

    /**
     * Constructeur de la classe SudokuUI.
     * @param sudoku La grille de Sudoku à afficher et à interagir.
     */
    public SudokuUI(Sudoku sudoku) {
        this.sudoku = sudoku;
        this.buttons = new JButton[9][9];

        setTitle(getTitleText());
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        JPanel gridPanel = new JPanel(new GridLayout(9, 9));
        gridPanel.setBackground(Color.WHITE);
        gridPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));

        // Création des boutons de la grille
        createGridButtons(gridPanel);

        // Calcul de la taille préférée de la fenêtre en fonction de la taille de la grille
        int preferredSize = 50 * 9; // 50 est la taille approximative d'un bouton
        gridPanel.setPreferredSize(new Dimension(preferredSize, preferredSize));

        add(gridPanel);
        pack(); // Redimensionne automatiquement la fenêtre pour s'adapter à la taille du panneau
        setLocationRelativeTo(null);
        setVisible(true);
    }

    /**
     * Méthode abstraite permettant d'obtenir le texte du titre de l'interface utilisateur.
     * @return Le texte du titre.
     */
    protected abstract String getTitleText();

    /**
     * Méthode pour créer les boutons de la grille de Sudoku.
     * @param gridPanel Le panneau de la grille où les boutons seront ajoutés.
     */
    protected void createGridButtons(JPanel gridPanel) {
        Grid grid = sudoku.getGrid(); // Obtenez la grille à partir de Sudoku
        for (int row = 0; row < 9; row++) {
            for (int col = 0; col < 9; col++) {
                JButton button = new JButton();
                button.setFont(new Font("Arial", Font.BOLD, 24));
                button.setContentAreaFilled(false);
                button.setBorder(BorderFactory.createLineBorder(Color.BLACK));
                button.setMinimumSize(new Dimension(50, 50)); // Taille minimale des boutons
    
                // Ajout de bordures plus épaisses pour délimiter les carrés de 3x3
                if ((row + 1) % 3 == 0 && (col + 1) % 3 == 0) {
                    button.setBorder(BorderFactory.createMatteBorder(1, 1, 3, 3, Color.BLACK));
                } else if ((row + 1) % 3 == 0) {
                    button.setBorder(BorderFactory.createMatteBorder(1, 1, 3, 1, Color.BLACK));
                } else if ((col + 1) % 3 == 0) {
                    button.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 3, Color.BLACK));
                }
    
                button.addActionListener(new SudokuButtonListener(row, col, sudoku, buttons));
                gridPanel.add(button);
                buttons[row][col] = button;
    
                // Mettez à jour le texte des boutons avec les valeurs de la grille Sudoku
                int value = grid.getCell(row, col).getValue();
                buttons[row][col].setText(value == 0 ? "" : String.valueOf(value));
            }
        }
    }
}