import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * La classe Grid représente une grille de Sudoku composée de cellules.
 */
public class Grid {
    private Cell[][] cells;

    /**
     * Constructeur par défaut qui initialise une grille de Sudoku vide.
     */
    public Grid() {
        cells = new Cell[9][9];
        for (int ligne = 0; ligne < 9; ligne++) {
            for (int column = 0; column < 9; column++) {
                cells[ligne][column] = new Cell();
            }
        }
    }

    /**
     * Charge une grille de Sudoku à partir d'un fichier.
     * @param fileName Le nom du fichier à partir duquel charger la grille avec extension ".gri".
     */
    public void loadGridFromFile(String fileName) {
        try (DataInputStream input = new DataInputStream(new FileInputStream(fileName))) {
            for (int ligne = 0; ligne < 9; ligne++) {
                String line = String.valueOf(input.readInt());
                int length = line.length();
                if (length < 9) {
                    line = "000000000".substring(length) + line; // Ajoute les zéros au début si nécessaire
                }
                for (int column = 0; column < 9; column++) {
                    char number = line.charAt(column);
                    int value = Character.getNumericValue(number);
                    cells[ligne][column].setValue(value);
                }
            }
            System.out.println("Success");
        } catch (IOException e) {
            System.err.println("Error: " + e.getMessage());
        }
    }
    
    /**
     * Sauvegarde la grille de Sudoku dans un fichier ".gri".
     * @param fileName Le nom du fichier dans lequel sauvegarder la grille.
     */
    public void saveGridToFile(String fileName) {
        try (DataOutputStream output = new DataOutputStream(new FileOutputStream(fileName))) {
            for (int ligne = 0; ligne < 9; ligne++) {
                StringBuilder line = new StringBuilder();
                for (int column = 0; column < 9; column++) {
                    int value = cells[ligne][column].getValue();
                    line.append(value);
                }
                output.writeInt(Integer.parseInt(line.toString()));
            }
            System.out.println("Grille sauvegardée avec succès dans " + fileName);
        } catch (IOException e) {
            System.err.println("Erreur lors de la sauvegarde de la grille: " + e.getMessage());
        }
    }

    /**
     * Obtient la cellule à la position spécifiée dans la grille.
     * @param ligne L'indice de ligne de la cellule.
     * @param col L'indice de colonne de la cellule.
     * @return La cellule à la position spécifiée.
     */
    public Cell getCell(int ligne, int col) {
        return cells[ligne][col];
    }

    /**
     * Copie le contenu d'une autre grille dans cette grille.
     * @param second_grid La grille à partir de laquelle copier les valeurs.
     */
    public void copyFrom(Grid second_grid) {
        for (int row = 0; row < 9; row++) {
            for (int col = 0; col < 9; col++) {
                this.cells[row][col].setValue(second_grid.cells[row][col].getValue());
            }
        }
    }

    /**
     * Vérifie si la grille est pleine (toutes les cellules sont remplies).
     * @return True si la grille est pleine, False sinon.
     */
    public boolean isFull() {
        for (int row = 0; row < 9; row++) {
            for (int col = 0; col < 9; col++) {
                if (getCell(row, col).getValue() == 0) {
                    return false;
                }
            }
        }
        return true;
    }


    /**
     * Affiche la grille de Sudoku dans la console.
     */
    public void printGrid() {
        for (int row = 0; row < 9; row++) {
            for (int col = 0; col < 9; col++) {
                System.out.print(cells[row][col].getValue() + " ");
            }
            System.out.println();
        }
    }
}