package Testate.Stream;
import java.util.*;
import java.util.stream.Collectors;

public class Main {

	public static void main(String[] args) {
        // Studenten und Prüfungen erstellen
        Student student1 = new Student("Lax Mustermann", "Berlin", "Informatik");
        student1.addPrüfung(new Prüfung("Mathe", 5, 1, 3.0));
        student1.addPrüfung(new Prüfung("Programmierung", 5, 1, 4.5));

        Student student2 = new Student("Anna Müller", "Hamburg", "Maschinenbau");
        student2.addPrüfung(new Prüfung("Mechanik", 5, 1, 2.0));
        student2.addPrüfung(new Prüfung("Thermodynamik", 5, 2, 1.7));

        Student student3 = new Student("Lisa Schmidt", "München", "Informatik");
        student3.addPrüfung(new Prüfung("Datenbanken", 5, 3, 3.5));
        student3.addPrüfung(new Prüfung("Betriebssysteme", 5, 4, 5.0));
        
        Student student4 = new Student("Aisa Schmidt", "München", "Cyber");
        student4.addPrüfung(new Prüfung("Datenbanken", 5, 3, 3.5));
        student4.addPrüfung(new Prüfung("Betriebssysteme", 5, 4, 5.0));
        
        Student studen5 = new Student("Aisa Schmidt", "München", "Informatik");
        studen5.addPrüfung(new Prüfung("Datenbanken", 5, 3, 3.5));
        studen5.addPrüfung(new Prüfung("Betriebssysteme", 5, 4, 5.0));

        // Liste von Studenten
        List<Student> studenten = new ArrayList<>();
        studenten.add(student1);
        studenten.add(student2);
        studenten.add(student3);
        studenten.add(student4);
        studenten.add(studen5);
        
        //Alle Prüfungen mit ihrem Namen, dem Semester, der Note und Namen des Studis ausgeben
        
        studenten.stream()
        .forEach(st -> System.out.println(st.getName() +" ,Prüfungen: "+ st.getPrüfungen()));
        System.out.println("Oben:");
        System.out.println();
        Map<Student,List<Prüfung>> aufgabe1 = studenten.stream()
        		.collect(Collectors.toMap(st -> st,st -> st.getPrüfungen()));
        //aufgabe1.forEach((a,b) ->System.out.println(a + " " + b));
        
        //Notenschnitt 
        Map<Student, Double> note = studenten.stream()
        		.collect(Collectors.toMap(st -> st, n -> n.getPrüfungen().stream().collect(Collectors.averagingDouble(t -> t.getNote()))));
	
	//note.forEach((a,b) -> System.out.println(a +" " +b));
	
	
	Map<Student, Double> note2 = studenten.stream()
    .collect(Collectors.toMap(
    		st -> st, // Direkte Verwendung des Studenten als Schlüssel
        student -> student.getPrüfungen().stream()
                          .mapToDouble(Prüfung::getNote) // Direkte Nutzung von mapToDouble
                          .average()
                          .orElse(0.0) // Falls keine Prüfungen vorhanden sind, Standardwert 0.0
    ));
	//Alle Studenten ausgeben, die eine Prüfung nicht bestanden haben
//	studenten.stream()
//	.filter(st -> st.getPrüfungen().stream().anyMatch(p -> p.getNote() >= 5))
//	.forEach(st -> System.out.println(st.toString()));
	

	Map<String, Double> durchschnittProStudiengang = studenten.stream()
		    .collect(Collectors.groupingBy(
		        Student::getStudiengang,
		        Collectors.averagingDouble(student -> student.getPrüfungen().stream()
		                                                      .mapToDouble(Prüfung::getNote)
		                                                      .average()
		                                                      .orElse(0.0))
		        											  
		    ));
	
	durchschnittProStudiengang.forEach((a,b) -> System.out.println(a + " " + b));
	}
	
	
}
