import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class RefactorToko {

    record Item(String nama, int harga) {}

    record Pesanan(String pembeli, List<Item> items) {}

    public static void main(String[] args) {
        List<Pesanan> pesanan = List.of(
            new Pesanan("Budi", List.of(new Item("Pena", 2000), new Item("Buku", 5000))),
            new Pesanan("Siti", List.of(new Item("Pensil", 1500))),
            new Pesanan("Dewi", List.of(new Item("Bag", 75000), new Item("Penghapus", 1000)))
        );

        // flatMap meratakan dua tingkat koleksi menjadi satu stream
        List<String> semuaItem = pesanan.stream()
            .flatMap(p -> p.items().stream())
            .map(Item::nama)
            .collect(Collectors.toList());
        System.out.println("semua item    = " + semuaItem);

        // collect membangun Map tanpa mutasi koleksi luar
        Map<String, Integer> totalPerPembeli = pesanan.stream()
            .collect(Collectors.toMap(
                Pesanan::pembeli,
                p -> p.items().stream().mapToInt(Item::harga).sum()));
        System.out.println("total belanja = " + totalPerPembeli);

        // method reference menjaga pipeline singkat dan terbaca
        List<String> daftarPembeli = pesanan.stream()
            .map(Pesanan::pembeli)
            .collect(Collectors.toList());
        System.out.println("pembeli       = " + daftarPembeli);
    }
}
