package Testate.Stream;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;


public class Finanzanalyse {

	private static ArrayList<Transaction> tran = new ArrayList<>();

	public static void main(String[] args) throws FileNotFoundException {
		addTran();

		// Eine gefilterte Liste mit allen Überweisungen in einer bestimmten Währung.
		Map<String, List<Transaction>> aufgabe1 = tran.parallelStream()
				.filter(t -> t.getCurrency().equalsIgnoreCase("EUR"))
				.collect(Collectors.groupingBy(t -> t.getCurrency(), Collectors.toCollection(ArrayList::new)));
		// aufgabe1.forEach((a,b) -> System.out.println(a +" " + b));

		// Anzahl und Anteil der Überweisungen, die ins Ausland gegangen sind
		Map<Transaction, Long> aufgabe2 = tran.parallelStream().filter(t -> t.getRecCountry() != null)
				.collect(Collectors.groupingBy(t -> t, Collectors.counting()));
		// aufgabe2.forEach((a,b) -> System.out.println(a + " " + b));
		Long aufgabe2_2 = tran.parallelStream().filter(t -> t.getRecCountry() != null).collect(Collectors.counting());

		// Gesamtsumme der Überweisungen in den jeweiligen Währungen.
		Long summe = tran.stream().filter(t -> t.getCurrency().equalsIgnoreCase("USD")).collect(Collectors.counting());
		// System.out.println(summe);

		// Gesamtmenge des (ausgehend) überwiesenen Gelds für einen gegebenen Sender und
		// eine gegebene Währung.
		Double gesamtmenge = tran.stream().filter(t -> t.getSender().getName().equalsIgnoreCase("Elizabeth Bernard"))
				.filter(t -> t.getCurrency().equalsIgnoreCase("EUR")).map(t -> t.getAmount())
				.reduce(0.0, (i, j) -> i + j);
		//System.out.println(gesamtmenge);
		
		// Die fünf höchsten Geldbeträge, die überwiesen worden sind (Währung kann
		// ignoriert werden).
		
		ArrayList<Transaction> maxGeldbeträge = tran.stream()
				.sorted((o1,o2) -> Double.compare(o2.getAmount(), o1.getAmount()))
				.limit(5)
				.collect(Collectors.toCollection(ArrayList::new));
		
	//	maxGeldbeträge.forEach(System.out::println);
		
		//Die zehn Konten, die an den meisten Transaktionen beteiligt sind.
		
		String[] array = {"H","A","H","A"};
		Map<String, List<String>> map = Stream.of(array)
				.collect(Collectors.groupingBy(Function.identity()));
		
		//map.forEach((a,b) -> System.out.println(a +" " +b));
		// 5) Holly Wood ausgehend an USD
				List<Transaction> beträge = tran.stream()
						.filter(tr -> "Holly Wood".equals(tr.getSender().getName()))
						.filter(tr -> "USD".equals(tr.getCurrency()))
						.collect(Collectors.toList());
					
					System.out.println(beträge);
				
				
	}

	public static void addTran() throws FileNotFoundException, NumberFormatException {
		File file = new File(
				"C:\\Users\\obaya\\git\\Programmierung2\\Programmierung2\\src\\streams\\synthetic_data.csv");
		Scanner sc = new Scanner(file);

		sc.nextLine();
		while (sc.hasNext()) {
			String line = sc.nextLine();
			String[] cols = line.split(",");

			Account sender = new Account(cols[0], cols[1]);
			Account receiver = new Account(cols[2], cols[3]);

			tran.add(new Transaction(sender, receiver, Double.parseDouble(cols[4]), cols[5],
					(cols.length == 6) ? null : cols[6]));
		}
		sc.close();

	}

	public ArrayList<Transaction> getTran() {
		return tran;
	}

}
