import javax.swing.JOptionPane;

/**
 * La classe Sudoku représente un jeu de Sudoku avec une grille associée.
 * Elle fournit des méthodes pour interagir avec la grille, telles que le chargement à partir d'un fichier,
 * l'impression de la grille et la vérification de l'état de résolution.
 */
public class Sudoku {
    private Grid grid;
    private boolean solved;
    private SudokuSolver solver;

    /**
     * Constructeur par défaut. Initialise un Sudoku avec une grille vide et non résolue.
     */
    public Sudoku() {
        this.grid = new Grid();
        this.solved = false;
        this.solver = new SudokuSolver();
    }
    
    /**
     * Obtient la grille associée à ce Sudoku.
     * @return La grille associée à ce Sudoku.
     */
    public Grid getGrid() {
        return grid;
    }

    /**
     * Définit une nouvelle grille pour ce Sudoku.
     * @param newGrid La nouvelle grille à définir.
     */
    public void setGrid(Grid newGrid) {
        this.grid = newGrid;
    }

    /**
     * Vérifie si ce Sudoku est résolu.
     * @return True si le Sudoku est résolu, False sinon.
     */
    public boolean isSolved() {
        return solved;
    }
    
    /**
     * Charge une grille de Sudoku à partir d'un fichier.
     * @param fileName Le nom du fichier à charger.
     */
    public void loadGridFromFile(String fileName) {
        this.grid.loadGridFromFile(fileName);
    }
    
    /**
     * Vérifie si la grille est résolue.
     */
    public void checkIfGridIsSolved() {
        Grid grid = getGrid();
        
        if (!grid.isFull()) {
            return;
        }
        
        this.solved = solver.solve(grid);
        
        if (this.solved) {
            JOptionPane.showMessageDialog(null, "Félicitations ! Vous avez résolu la grille avec succès !");
        } else {
            JOptionPane.showMessageDialog(null, "Désolé, la grille est complète mais la solution n'est pas correcte.");
        }
    }
    

    /**
     * Imprime la grille de Sudoku sur la sortie standard.
     * Chaque ligne de la grille est imprimée sur une ligne distincte.
     */
    public void printGrid() {
        for (int row = 0; row < 9; row++) {
            for (int col = 0; col < 9; col++) {
                int value = grid.getCell(row, col).getValue();
                System.out.print(value + " ");
            }
            System.out.println(); // Passer à la ligne suivante après chaque ligne de la grille
        }
    }
}