package hu.ppke.itk.hakta.hf02;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

class ExitException extends Exception {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
}

public class Main {
	
	private static File getFolder() throws IOException, ExitException {
		String path = "";
		File dir;
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		System.out.println("Add meg a tartalmazó mappa útvonalát!");
		do {
			path = br.readLine();
			if (path.equals("")) throw new ExitException();
			   dir = new File(path);
			if(! dir.exists())
				System.out.println("A mappa nem létezik. Válassz egy másikat vagy nyomj entert a kilépéshez.");
		} while(! dir.exists());
		
		return dir;
	}
	
	private static String getRegex() throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		System.out.println("Add meg a mintát (regex)!");
		String regex = br.readLine();
		return regex;
	}

	public static void main(String[] args) {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		boolean exit = false;
		try {
			File d = getFolder();
			String regex = getRegex();
				
			while (exit == false) {
				File[] ListOfFiles = d.listFiles();
				
				System.out.println("Mit szeretnél tenni?");
				System.out.println("\t1 -> Mintához passzoló fájlok listázása");
				System.out.println("\t2 -> Fájlok összefűzése");
				System.out.println("\t3 -> Keresés a fájlokban");
				System.out.println("\t4 -> Mappa váltása");
				System.out.println("\t5 -> Minta cseréje");
				System.out.println("\t0 -> Kilépés");
				
				String command = br.readLine();
				int commandNum;
				if(command.matches("\\d*") == false)
					commandNum = 10;
				else 
					commandNum = Integer.parseInt(command);
				
				switch (commandNum) {
				case 0:
					exit = true; break;
				case 1:
					System.out.println("A '" + regex + "' mintához passzoló fájlok a megadott mappában:");
					BufferedWriter list = new BufferedWriter(new FileWriter("list.txt"));
					for (File f : ListOfFiles)
						if (f.getName().matches(regex)) {
							System.out.println(f.getPath());
							list.write(f.getPath() + '\n');
						}
					list.close();
					System.out.println("A mintához passzoló fájlok listája kiírásra került a list.txt fájlba.");
					break;
					
				case 2:
					BufferedWriter out = new BufferedWriter(new FileWriter("out.txt"));
					String files = "";
					for (File f : ListOfFiles)
						if (f.getName().toLowerCase().endsWith(".txt") && f.getName().matches(regex)) {
							out.write(new String(Files.readAllBytes(Paths.get(f.getPath()))) + '\n');
							files += f.getName() + ", ";
						}
					out.close();
					System.out.println("A(z) " + files +
							" fájlok összefűzésre kerültek az out.txt fájlba, a többi nem megfelelő formátumú.");
					break;
					
				case 3:
					String regex2 = getRegex();
					BufferedWriter stat = new BufferedWriter(new FileWriter("stat.txt"));
					stat.write("A minta: " + regex2 + '\n');
					Pattern p = Pattern.compile(regex2);
					for (File f : ListOfFiles)
						if (f.getName().toLowerCase().endsWith(".txt") && f.getName().matches(regex)) {
							String text = new String(Files.readAllBytes(Paths.get(f.getPath())));
							Matcher m = p.matcher(text);
							int cnt = 0;
							while(m.find()) cnt++;
							stat.write(f.getName() + ": " + cnt + '\n');
						}
					stat.close();
					System.out.println("A(z) " + regex2 +
							" mintára illeszkedő szavak keresése befejeződött, és az eredmény kiírásra került a stat.txt fájlba.");
					break;
					
				case 4:
					d = getFolder(); break;
					
				case 5:
					regex = getRegex(); break;
				default:
					System.out.println("Hibás bemenet!");
				}
				System.out.println("---------------------------------------------------------------------");
			}

			br.close();
		}
		catch (IOException e) {
			e.printStackTrace();
		} catch (ExitException e) {
		}  finally {
    		System.out.println("A program befejezte futását.");
    	}
	}

}
