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

public class PraktikBaik {

    record Peserta(long id, String nama, String email) {
        String ringkas() {
            return "#" + id + " " + nama + " <" + email + ">";
        }
    }

    // Repository menyerap SQL; kode bisnis hanya melihat objek domain
    static final class PesertaRepo {
        private final List<Peserta> tabel = new ArrayList<>();
        private long urut = 0;

        Peserta simpan(String nama, String email) {
            // input divalidasi DI BATAS -- bukan di SQL
            if (nama == null || nama.isBlank() || !email.endsWith("@example.com")) {
                throw new IllegalArgumentException("data peserta tidak sah");
            }
            Peserta baru = new Peserta(++urut, nama.strip(), email.toLowerCase());
            tabel.add(baru);
            return baru;
        }

        List<Peserta> cariNama(String kata) {
            List<Peserta> hasil = new ArrayList<>();
            for (Peserta p : tabel) {
                if (p.nama().toLowerCase().contains(kata.toLowerCase())) {
                    hasil.add(p);
                }
            }
            return hasil;
        }
    }

    public static void main(String[] args) {
        PesertaRepo repo = new PesertaRepo();
        repo.simpan("Budi Santoso", "BUDI@example.com");
        repo.simpan("Siti Rahayu", "siti@example.com");
        repo.simpan("Dewi Lestari", "dewi@example.com");

        System.out.println("cari 'bu' : " + ringkas(repo.cariNama("bu")));
        System.out.println("cari 'ti' : " + ringkas(repo.cariNama("ti")));

        try {
            repo.simpan("Salah", "bukan-email");
        } catch (IllegalArgumentException e) {
            System.out.println("ditolak     : " + e.getMessage());
        }
    }

    static List<String> ringkas(List<Peserta> daftar) {
        List<String> r = new ArrayList<>();
        for (Peserta p : daftar) {
            r.add(p.ringkas());
        }
        return r;
    }
}
