import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Iterator;
import java.io.PrintWriter;

class Driver {
	private static Matrix<Integer> m = null;

	public static void main(String[] args) {

		Scanner kb = new Scanner(System.in);

		do {
			System.out.println("1. read matrix from file");
			System.out.println("2. generate matrix");
			System.out.println("3. print matrix");
			System.out.println("4. save matrix to file");
			System.out.println("5. exit");
			System.out.print("Please choose: ");
	
			int choice = kb.nextInt();
			System.out.println();

			switch(choice) {
				case 1:
					readMatrixFromFile(kb);
					break;
				case 2:
					generateMatrix(kb);
					break;
				case 3:
					printMatrix(kb);
					break;
				case 4:
					saveMatrixToFile(kb);
					break;
				case 5:
					kb.close();
					return;
				default:
					System.out.println("Invalid option");
			}

		} while(true);
 
	}
	
	private static void readMatrixFromFile(Scanner kb) {

		System.out.println("Please enter a file name");
		String fileName = kb.next();

		Scanner fin = null;
	
		try {
			fin = new Scanner(new File(fileName));
		}
		catch (FileNotFoundException e) {
			System.out.println("Dude - you forgot to create matrix.txt");
			return;
		}

		fin.useDelimiter(",|\n");

		int rows = fin.nextInt();
		int cols = fin.nextInt();

		m = new Matrix<>(rows,cols);

		while(fin.hasNext()) {
			int elm = fin.nextInt();
			m.add(elm);
		}

		fin.close();
	}


	private static void generateMatrix(Scanner kb) {

		int rows = 0;
		int cols = 0;

		System.out.println("Enter the number of rows");
		rows = kb.nextInt();
		System.out.println();

		System.out.println("Enter the number of columns");
		cols = kb.nextInt();
		System.out.println();

		m = new Matrix<>(rows, cols);

		System.out.println("1. increasing order");
		System.out.println("2. zig zag");
		System.out.print("Enter choice: ");

		int choice = kb.nextInt();
		System.out.println();

		if (choice == 1) {
			System.out.println("Generating increasing order matrix");
			int count = 0;
			for (int i = 0; i < rows * cols; i++) {
				m.add(count++);
			}		
		}
		else if (choice == 2) {
			System.out.println("Generating zig zag matrix");
			int count = 0;
			int curRow = 0;
			int curCol = 0;

			Matrix.ZigZagIterator it = (Matrix.ZigZagIterator) m.zigzagIterator();

			while(it.hasNext()) {
				m.add(curRow, curCol, count++);

				it.next();
				curRow = it.getCurRow();
				curCol = it.getCurCol();
			}
		}
		else {
			System.out.println("Invalid choice");
		}		
	}

	private static void printMatrix(Scanner kb) {
		
		do {
			System.out.println("1. standard");
			System.out.println("2. diagonal");
			System.out.println("3. zigzag");
			System.out.println("4. return to previous menu");
			System.out.print("Please choose: ");
	
			int choice = kb.nextInt();
			System.out.println();

			Iterator<Integer> it = null;

			switch (choice) {
				case 1:
					for(Integer i : m) {
						System.out.print(i + " ");
					}
					/*
					for(int i = 0; i < m.numRows(); i++) {
						for (int j = 0; j < m.numCols(); j++) {
							System.out.printf("%4d ", m.peek(i,j));
						}
						System.out.println();
					}
					*/
					System.out.println();
					break;
				case 2:
					it = m.diagonalIterator();
					while(it.hasNext()) {
						System.out.print(it.next() + " ");
					}
					System.out.println();
					break;
				case 3:
					it = m.zigzagIterator();
					while(it.hasNext()) {
						System.out.print(it.next() + " ");
					}
					System.out.println();
					break;
				case 4:
					return;		
				default:
					System.out.println("Invalid choice");
			}
		
			System.out.println();

		} while(true);
	}

	private static void saveMatrixToFile(Scanner kb) {


	}
}
