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

/**
 * La classe SudokuCreator étend la classe SudokuUI et permet de créer des grilles de Sudoku.
 */
public class SudokuCreator extends SudokuUI {
    private static int numberOfClues = 25; // Nombre de "clues" par défaut

    /**
     * Constructeur de la classe SudokuCreator.
     * @param sudoku Instance de la classe Sudoku.
     */
    public SudokuCreator(Sudoku sudoku) {
        super(sudoku);
        createAdditionalButtons();
    }

    /**
     * Crée les boutons supplémentaires pour charger, générer et sauvegarder les grilles de Sudoku.
     */
    protected void createAdditionalButtons() {
        createLoadButton();
        createGenerateButton();
        createSaveButton();
        pack();
    }

    /**
     * Crée le bouton pour charger une grille de Sudoku depuis un fichier.
     */
    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, BorderLayout.NORTH);
        add(buttonPanel, BorderLayout.NORTH);
    }

    /**
     * Crée le bouton pour générer une nouvelle grille de Sudoku.
     */
    private void createGenerateButton() {
        JButton generateButton = new JButton("Générer");
        generateButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // Demander à l'utilisateur combien de "clues" il souhaite spécifier
                String input = JOptionPane.showInputDialog(null, "Entrez le nombre de clues :");
                try {
                    // Convertir l'entrée en entier
                    numberOfClues = Integer.parseInt(input);
                } catch (NumberFormatException ex) {
                    // Gérer les cas où l'utilisateur entre un texte non numérique
                    JOptionPane.showMessageDialog(null, "Veuillez entrer un nombre valide.", "Erreur", JOptionPane.ERROR_MESSAGE);
                    return; // Sortir de la méthode si l'entrée n'est pas un nombre valide
                }
    
                // Générer une nouvelle grille Sudoku avec le nombre de "clues" spécifié
                Grid newGrid = GenerateGrid.generateSudokuGrid(numberOfClues);
                // 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, BorderLayout.EAST);
        add(buttonPanel, BorderLayout.EAST);
    }

    /**
     * Crée le bouton pour sauvegarder la grille de Sudoku dans un fichier.
     */
    private void createSaveButton() {
        JButton saveButton = new JButton("Sauvegarder");
        saveButton.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.showSaveDialog(null);
                if (returnValue == JFileChooser.APPROVE_OPTION) {
                    File selectedFile = fileChooser.getSelectedFile();
                    sudoku.getGrid().saveGridToFile(selectedFile.getAbsolutePath());
                }
            }
        });

        JPanel buttonPanel = new JPanel();
        buttonPanel.add(saveButton, BorderLayout.WEST);
        add(buttonPanel, BorderLayout.WEST);
    }

    /**
     * Met à jour l'affichage de la grille dans l'interface utilisateur.
     */
    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));
            }
        }
    }

    /**
     * Obtient le texte du titre de l'interface utilisateur.
     * @return Le texte du titre.
     */
    @Override
    protected String getTitleText() {
        return "Sudoku Creator";
    }

    /**
     * Méthode principale pour tester la classe SudokuCreator.
     * @param args Arguments de la ligne de commande (non utilisés).
     */
    public static void main(String[] args) {
        Sudoku sudoku = new Sudoku();
        new SudokuCreator(sudoku);
    }

}