import java.io.*;
import java.util.Scanner;

public class FindPattern {
	
	public static int[] RowColCounter(String filename){
		//Zählt die maximale Anzahl der Zeilen und Spalten in einer Textdatei
		int [] res = new int[] {0,0};
		int col = 0;
		int row = 0;
		try {
			FileInputStream file = new FileInputStream(filename);
			Scanner s = new Scanner(file);
			while (s.hasNextLine()) {
				//Jede Zeile wird einzelnt eingelesen.
				 String line = s.nextLine();
				 //Für jede Zeile wird row erhöht
				 row++;
				 //Es wird überprüft, ob die Spaltenanzahl dieser Zeile maximal ist.
				 if (col < line.length()) col = line.length();
			}
			file.close();
			s.close();
		} 
		catch (IOException e) {
			System.out.println("Fehler in RowColCounter");
			res[0] = res[1]= 0;
			return res;
		}
		res[0] = row;
		res[1] = col;
		return res;
	}

	
	public static char[][] ReadMatrix(int row, int col, String filename){
		//Einlesen der Textdatei als Matrix
		char arr[][] = new char[row][col];
		try {
			FileInputStream file = new FileInputStream(filename);
			Scanner s = new Scanner(file);
			int k=0;
			while (s.hasNextLine()) {
				 String line = s.nextLine();
				for (int i=0 ;i<line.length(); i++){
					arr[k][i] = line.charAt(i);
				}
				k++;
			}
			file.close();
			s.close();
		} catch (IOException e) {
			System.out.println("Fehler in ReadMatrix");
		}
		return arr;
	}
	
	
	public static void main(String[] args) {
		/*Die Idee besteht darin, zwei Textdateien zu laden, wobei die erste das zu suchende Muster für die 
		 * zweite Textdatei enthält. 
		 */
		
		String patternFilename = "";
		String dataFilename="";
		
		// Die beiden Dateien werden über den Aufruf angegeben:
		if (args.length != 2) {
			//TODO: Die Benutzerinformation muss noch besser beschrieben werden.
			System.out.println("Bitte geben Sie nach dem Programmaufruf den Namen der Mustertextdatei und den der Datentextdatei an.");
			
		}
		else {
			patternFilename = args[0];
			dataFilename = args[1];
				
			//Zeilen und Spalten der Matrix
			int [] rowColDataFile  = RowColCounter(dataFilename);  //Zeilen- und Spaltenanzahl der DataDatei - Index 0 Zeilen, Index 1 Spalten
			int [] rowColPatternFile  = RowColCounter(patternFilename);  //Zeilen- und Spaltenanzahl der Musterdatei
			//Einlesen der Matrix
			char [][] dataMatrix = ReadMatrix(rowColDataFile[0], rowColDataFile[1], dataFilename); //Inhalt der Datadatei
			char [][] patternMatrix = ReadMatrix(rowColPatternFile[0], rowColPatternFile[1], patternFilename);  //Inhalt der Musterdatei
			
			
			//Suchen des Musters aus der Patterndatei in der Datadatei
			int numberOfFoundPattern = 0;
			int colOffset, rowOffset;
			//Die DataDatei muss nur bis zu ihrer Zeilenzahl abzüglich der Musterhöhe untersucht werden.
			//Die DataDatei muss nur bis zu ihrer Spaltenzahl abzüglich der Musterbreite untersucht werden.
			for(int r = 0; r < rowColDataFile[0]-rowColPatternFile[0]+1; r++) {
				for (int c = 0; c < rowColDataFile[1] - rowColPatternFile[1]+1; c++) {
					colOffset = 0;
					rowOffset = 0;
					while (dataMatrix[r+rowOffset][c+colOffset] == patternMatrix[rowOffset][colOffset]) {  //Solange die Daten mit dem Muster übereinstimmen... 
						colOffset++; 
						if (colOffset == rowColPatternFile[1]) {  //Wenn die Breite des Musters erreicht ist...
							colOffset = 0;
							rowOffset++; // ...geht es in der nächsten Zeile weiter
						}
						if (rowOffset == rowColPatternFile[0]) { //wenn nun auch alle Spalten und Zeilen des Musters mit dem Dataeintrag übereinstimmen 
							numberOfFoundPattern++;
							System.out.print("Object found!  row: " + r+1 + " col "  + c + 1 + " : Number of found pattern: " + numberOfFoundPattern + ";\n");
							c+=rowColPatternFile[1]-1;  //Die Breite des Musters wurde schon untersucht.
							break;
						}
					}
				}
			}
			System.out.println("Es wurden " + numberOfFoundPattern  + " Übereinstimmungen gefunden.");
		}
		
	}
}


