import java.util.List;

public class ContohFixture {

    enum Tingkat { BIASA, PERAK, EMAS }

    static final class Pelanggan {
        private final String nama;
        private final String email;
        private final String kota;
        private final Tingkat tingkat;
        private final int poin;

        private Pelanggan(Builder b) {
            this.nama = b.nama;
            this.email = b.email;
            this.kota = b.kota;
            this.tingkat = b.tingkat;
            this.poin = b.poin;
        }

        String nama() { return nama; }
        String email() { return email; }
        String kota() { return kota; }
        Tingkat tingkat() { return tingkat; }
        int poin() { return poin; }

        @Override
        public String toString() {
            return String.format("%-6s %-22s %-8s %-6s %5d",
                nama, email, kota, tingkat, poin);
        }
    }

    // ---- builder: default wajar, ubah hanya yang relevan untuk test ----

    static final class Builder {
        private String nama = "Budi";
        private String email = "budi@example.com";
        private String kota = "Bandung";
        private Tingkat tingkat = Tingkat.BIASA;
        private int poin = 0;

        Builder nama(String nilai) { this.nama = nilai; return this; }
        Builder email(String nilai) { this.email = nilai; return this; }
        Builder kota(String nilai) { this.kota = nilai; return this; }
        Builder tingkat(Tingkat nilai) { this.tingkat = nilai; return this; }
        Builder poin(int nilai) { this.poin = nilai; return this; }

        Pelanggan build() { return new Pelanggan(this); }
    }

    // ---- object mother: skenario bernama yang dipakai lintas test ----

    static final class DataContoh {
        static Pelanggan pelangganStandar() {
            return new Builder().build();
        }

        static Pelanggan pelangganPremium() {
            return new Builder()
                .nama("Siti").email("siti@example.com")
                .tingkat(Tingkat.EMAS).poin(1200)
                .build();
        }

        static Pelanggan pelangganBaru() {
            return new Builder()
                .nama("Dewi").email("dewi@example.com").kota("Depok")
                .build();
        }
    }

    public static void main(String[] args) {
        List<Pelanggan> fixture = List.of(
            DataContoh.pelangganStandar(),
            DataContoh.pelangganPremium(),
            DataContoh.pelangganBaru(),
            new Builder().poin(75).build()   // variasi lokal: hanya poin diubah
        );

        System.out.printf("%-6s %-22s %-8s %-6s %5s%n", "nama", "email", "kota", "tingkat", "poin");
        for (Pelanggan p : fixture) {
            System.out.println(p);
        }
    }
}
