import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

public class StreamsBeispiel {

    public static void main(String[] args) {
        List<Kunde> kunden = new ArrayList<>();

        kunden.add(new Kunde(1, 4.0, "Simon"));
        kunden.add(new Kunde(2, 24.0, "Ferdl"));
        kunden.add(new Kunde(3, 60.0, "David"));
        kunden.add(new Kunde(4, 80.0, "Sebastian"));
        kunden.add(new Kunde(5, 1.0, "Noah"));
        kunden.add(new Kunde(6, 60.0, "Ronja"));

        // 0.2 + 0.84 + 0.80 = 1.84

        kunden.stream()
                .filter(kunde -> kunde.getGuthaben() > 20.0)
                .filter(kunde -> kunde.getGuthaben() < 70.0)
                .forEach(k -> {
                    System.out.println("Das Guthaben von " + k.getName() + " beträgt:");
                    System.out.println("\t" + k.getGuthaben());
                });


        System.out.println("-------------------------");

        System.out.println("Wir würden unseren Kunden so viel Geld schenken: " +
                kunden.stream()
                    .filter(kunde -> kunde.getGuthaben() < 20.0)
                    .mapToDouble(kunde -> kunde.getGuthaben() * 0.2)
                    .sum()
        );
        System.out.println("-------------------------");

        /*
        ALTE METHODE ohne Lambda:

        
        kunden.sort(
                new Comparator<Kunde>() {
                    @Override
                    public int compare(Kunde o1, Kunde o2) {
                        if(o1.getGuthaben() == o2.getGuthaben()) {
                            return o1.getName().compareTo(o2.getName());
                        } else {
                            if(o1.getGuthaben() > o2.getGuthaben()) {
                                return -1;
                            } else {
                                return 1;
                            }
                        }
                    }
                }
        );

         */


        kunden.sort(
                Comparator
                        .comparing((Kunde k) -> k.getGuthaben())
                        .thenComparing((Kunde k) -> k.getName())
                        .reversed()
        );

        for (Kunde k : kunden) {
            System.out.println(k.getName() + " (" + k.getKundennummer() + "): " + k.getGuthaben());
        }


    }

}

class Kunde {

    private int kundennummer;
    private double guthaben;
    private String name;

    public Kunde(int kundennummer, double guthaben, String name) {
        this.kundennummer = kundennummer;
        this.guthaben = guthaben;
        this.name = name;
    }

    public int getKundennummer() {
        return kundennummer;
    }

    public void setKundennummer(int kundennummer) {
        this.kundennummer = kundennummer;
    }

    public double getGuthaben() {
        return guthaben;
    }

    public void setGuthaben(double guthaben) {
        this.guthaben = guthaben;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
