import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.filechooser.FileNameExtensionFilter;

public class SudokuUI extends JFrame {
    private Sudoku sudoku;
    private JButton[][] buttons;

    public SudokuUI(Sudoku sudoku) {
        this.sudoku = sudoku;
        this.buttons = new JButton[9][9];

        setTitle("Sudoku");
        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);

        // Création du bouton "Résoudre"
        createSolveButton();

        // Création des boutons "Charger" et "Générer"
        createLoadButton();
        createGenerateButton();

        // 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);
    }

    private 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.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));
            }
        }
    }

    private void createSolveButton() {
        JButton solveButton = new JButton("Résoudre");
        solveButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                SudokuSolver solver = new SudokuSolver(); // Créez une instance de SudokuSolver
                Grid solvedGrid = new Grid(); // Créez une nouvelle grille pour stocker la solution
                solvedGrid.copyFrom(sudoku.getGrid()); // Copiez la grille actuelle de Sudoku

                // Résolvez la grille
                if (solver.solve(solvedGrid)) {
                    // Si une solution est trouvée, mettez à jour la grille Sudoku avec la solution
                    sudoku.getGrid().copyFrom(solvedGrid);
                    updateGrid();
                } else {
                    // Sinon, affichez un message indiquant que la grille est insoluble
                    JOptionPane.showMessageDialog(null, "La grille est insoluble.");
                }
            }
        });

        JPanel buttonPanel = new JPanel();
        buttonPanel.add(solveButton);
        add(buttonPanel, BorderLayout.SOUTH);
    }

    private void createLoadButton() {
        JButton loadButton = new JButton("Charger");
        loadButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JFileChooser fileChooser = new JFileChooser();
                FileNameExtensionFilter filter = new FileNameExtensionFilter("Fichiers de grille Sudoku (*.gri)", "gri");
                fileChooser.setFileFilter(filter);
                int returnValue = fileChooser.showOpenDialog(null);
                if (returnValue == JFileChooser.APPROVE_OPTION) {
                    File selectedFile = fileChooser.getSelectedFile();
                    sudoku.loadGridFromFile(selectedFile.getAbsolutePath());
                    updateGrid();
                }
            }
        });

        JPanel buttonPanel = new JPanel();
        buttonPanel.add(loadButton);
        add(buttonPanel, BorderLayout.NORTH);
    }

    private void createGenerateButton() {
        JButton generateButton = new JButton("Générer");
        generateButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // Générer une nouvelle grille Sudoku
                Grid newGrid = GenerateGrid.generatePuzzleGrid();
                // Définir la nouvelle grille dans l'instance de Sudoku
                sudoku.setGrid(newGrid);
                // Afficher la grille générée dans la console
                sudoku.printGrid();
                // Mettre à jour l'interface utilisateur pour afficher la nouvelle grille
                updateGrid();
            }
        });
    
        JPanel buttonPanel = new JPanel();
        buttonPanel.add(generateButton);
        add(buttonPanel, BorderLayout.EAST);
    }
    

    private void updateGrid() {
        Grid grid = sudoku.getGrid();
        for (int row = 0; row < 9; row++) {
            for (int col = 0; col < 9; col++) {
                int value = grid.getCell(row, col).getValue();
                buttons[row][col].setText(value == 0 ? "" : String.valueOf(value));
            }
        }
    }
}