import java.util.HashSet;
import java.util.Set;

public class DataTransparan {

    // Record: pembawa data transparan + validasi compact constructor.
    record Pelanggan(String nama, String email, int poin) {

        Pelanggan {
            if (!email.endsWith("@example.com")) {
                throw new IllegalArgumentException(
                        "email harus @example.com: " + email);
            }
            if (poin < 0) {
                throw new IllegalArgumentException("poin tidak boleh negatif");
            }
        }

        // Factory bernama untuk kasus umum: pelanggan baru tanpa poin.
        static Pelanggan baru(String nama, String email) {
            return new Pelanggan(nama, email, 0);
        }

        // Pola "wither": salinan baru dengan satu field diubah.
        Pelanggan tambahPoin(int tambahan) {
            return new Pelanggan(nama, email, poin + tambahan);
        }
    }

    interface Berlabel { String label(); }

    record Tag(String kode) implements Berlabel {
        @Override
        public String label() { return "#" + kode; }
    }

    public static void main(String[] args) {
        var budi = new Pelanggan("Budi", "budi@example.com", 120);
        var budiDuplikat = new Pelanggan("Budi", "budi@example.com", 120);
        var sita = Pelanggan.baru("Sita", "sita@example.com");

        System.out.println("toString   : " + budi);
        System.out.println("equals     : " + budi.equals(budiDuplikat));
        System.out.println("hashCode   : " + (budi.hashCode() == budiDuplikat.hashCode()));
        System.out.println("poin Sita  : " + sita.poin());

        var naik = budi.tambahPoin(30);
        System.out.println("poin Budi  : " + budi.poin() + " -> " + naik.poin());

        Set<Pelanggan> himpunan = new HashSet<>();
        himpunan.add(budi);
        himpunan.add(budiDuplikat);
        System.out.println("set berisi : " + himpunan.size() + " elemen");

        System.out.println("label tag  : " + new Tag("java25").label());

        try {
            new Pelanggan("Dewi", "dewi@mail.example.net", 0);
        } catch (IllegalArgumentException e) {
            System.out.println("validasi   : " + e.getMessage());
        }
    }
}
