import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.NoSuchElementException;
import java.util.StringTokenizer;

/**
 * Methods needed to read and write the puzzle
 */

public class PuzzleInputOutput {
	private static String[][] puzzleStart;
	static String[][] puzzleDestination;
	private static int arraySize;

	/**
	 * This method reads the data from the file and initialises the Start and
	 * Destination states of the Puzzle
	 * 
	 * @param puzzleFile
	 * @throws IOException
	 */
	public PuzzleInputOutput(String puzzleFile) throws IOException {

		BufferedReader reader = new BufferedReader(new FileReader(puzzleFile));

		String line = reader.readLine();

		arraySize = Integer.parseInt(line);

		puzzleStart = new String[arraySize][arraySize];
		puzzleDestination = new String[arraySize][arraySize];

		boolean flag = true;
		String trennzeichen = "---";
		int i = 0;

		while ((line = reader.readLine()) != null) {
			StringTokenizer str = new StringTokenizer(line);

			// Füllen des StartArrays
			try {
				if (i < arraySize && flag) {
					for (int j = 0; j < arraySize; j++) {
						String wert = str.nextToken();
						puzzleStart[i][j] = wert;
					}
					i++;
					// Hat das StartArray zu viele Spalten, wirf Exception
					if (i == arraySize && str.hasMoreTokens()) {
						throw new PuzzleFileFormatException(
								"Startarray hat zu viel Spalten");
					}
				}
				// Die Größe des Startarrays entspricht nicht der gegebenen
				// Arraygröße
			} catch (NoSuchElementException e) {
				throw new PuzzleFileFormatException(
						"Die gegebene Arraygröße stimmt nicht mit dem Array überein");
			}
			if (line.startsWith("-") && line.length() != 3) {
				throw new PuzzleFileFormatException("Falsches Trennzeichen");
			}
			if (i >= arraySize && !line.equals(trennzeichen)
					&& str.hasMoreTokens()) {
				throw new PuzzleFileFormatException("Eine Zeile zu viel");
			}
			// Unzulässiges Trennzeichen

			// Wurde das richtige Trennzeichen gefunden, setze i auf 0 zurück
			// und die flag auf false um zum Zielpuzzle zu gelangen
			else if (line.equals(trennzeichen)) {
				flag = false;
				i = 0;

				// Füllen des Zielarrays
			} else if (!flag && i < arraySize) {
				for (int j = 0; j < arraySize; j++) {
					String wert = str.nextToken();
					puzzleDestination[i][j] = wert;
				}
				i++;
				// Hat das Zielarray zu viele Spalten, wirf Exception
				if (i == arraySize && str.hasMoreTokens()) {
					throw new PuzzleFileFormatException(
							"Zielarray hat zu viel Spalten");
				}

			}
		}
	}

	/*
	 * TODO: The following code can be used to start with the implementation //
	 * read the puzzle from file BufferedReader reader = new BufferedReader(new
	 * FileReader(puzzleFile)); String line = reader.readLine(); line =
	 * line.trim(); // get the size of the puzzle (NxN) int size =
	 * Integer.parseInt(line); // initialise puzzle size puzzleStart = new
	 * String[size][size]; puzzleDestination = new String[size][size]; // read
	 * Start puzzle ...
	 */

	/**
	 * It prints the given puzzle state
	 * 
	 * @param puzzle
	 *            the puzzle
	 */
	public static void printPuzzle(String[][] puzzle) {
		for (int i = 0; i < arraySize; i++) {
			for (int j = 0; j < arraySize; j++) {
				System.out.print(puzzle[i][j] + " ");
			}
			System.out.print("\n");
		}
	}

	/**
	 * @return the puzzleStart
	 */
	public String[][] getPuzzleStart() {
		return puzzleStart;
	}

	/**
	 * @return the puzzleDestination
	 */
	public String[][] getPuzzleDestination() {
		return puzzleDestination;
	}

	public static int getArraySize() {
		return arraySize;
	}
	
//	public static void main(String[] args) throws IOException {
//		PuzzleInputOutput foo = new PuzzleInputOutput("test_3.txt");
//		foo.printPuzzle(puzzleStart);
//		foo.printPuzzle(puzzleDestination);
//	}
}
