package sudoku;

import sudoku.constraint.IConstraint;

import java.util.ArrayList;
import java.util.List;

/**
 * @class MultiDoku
 * @brief Représente une grille de Multidoku.
 *        Une grille de sudoku est un multidoku avec un seul sous-sudoku
 */
public class MultiDoku {

	private final List<Sudoku> subGrids;

	public MultiDoku(List<Sudoku> subGrids) {
		this.subGrids = subGrids;
	}

	public int getNbSubGrids(){
		return subGrids.size();
	}

	public Sudoku getSubGrid(int i){
		return subGrids.get(i);
	}

	public boolean isValid(List<IConstraint> constraints){
		for (Sudoku sudoku : subGrids){
			if (!sudoku.isValid(constraints))
				return false;
		}
		return true;
	}

	public List<MutableCell> getMutableCells(){
		List<MutableCell> mutableCells = new ArrayList<>();
		for (Sudoku sudoku : subGrids){
			mutableCells.addAll(sudoku.getMutableCells());
		}
		return mutableCells;
	}

	public void updateSymbolsPossibilities() throws Exception {
		for (Sudoku sudoku : subGrids){
			sudoku.updateSymbolsPossibilities();
		}
	}

	@Override
	public String toString() {
		StringBuilder sb = new StringBuilder();
		sb.append("Multidoku {");
		for (Sudoku sudoku : subGrids){
			sb.append("\n\t").append(sudoku.toString());
		}
		sb.append("\n}");
		return sb.toString();
	}
}
