package sudoku.solver;

import java.util.List;

import sudoku.structure.Cell;
import sudoku.structure.MultiDoku;

public class HumanSolver implements Solver {

	/**
	 * Résout le MultiDoku passé en paramètre, avec règles de déduction.
	 *
	 * @param doku MultiDoku, MultiDoku à résoudre.
	 * @return boolean, valant true si le MultiDoku est résolu, false sinon.
	 */
	@Override
	public boolean solve(MultiDoku doku, List<SolverStep> steps) {
		while (!doku.isSolved()) {
			boolean filledCell = false;
			for (Cell cell : doku.getCells()) {
				if (!cell.isMutable() || !cell.isEmpty())
					continue;
				
				List<Integer> possibleSymbols = cell.getPossibleSymbols();
				if (possibleSymbols.size() == 1) {
					cell.setSymbolIndex(possibleSymbols.getFirst());
					addStep(cell, steps);
					filledCell = true;
				}
			}
			// on ne peut plus remplir de cases, on abandonne
			if (!filledCell)
				return false;
		}

		return true;
	}

}
