record Produk(long id, String nama, String kategori, int harga) {
}

interface ProdukRepository {
    Produk tambah(Produk p);

    List<Produk> semua();

    Optional<Produk> cariById(long id);

    List<Produk> cariByKategori(String kategori);

    List<Produk> cariHargaDiBawah(int batas);

    List<Produk> cariKataKunci(String kata);

    boolean hapus(Produk p);
}

class ProdukRepositoryMemori implements ProdukRepository {
    private final Map<Long, Produk> data = new LinkedHashMap<>();
    private final AtomicLong urutId = new AtomicLong();

    @Override
    public Produk tambah(Produk p) {
        long idBaru = urutId.incrementAndGet();
        Produk tersimpan = new Produk(idBaru, p.nama(), p.kategori(), p.harga());
        data.put(idBaru, tersimpan);
        return tersimpan;
    }

    @Override
    public List<Produk> semua() {
        return List.copyOf(data.values());
    }

    @Override
    public Optional<Produk> cariById(long id) {
        return Optional.ofNullable(data.get(id));
    }

    @Override
    public List<Produk> cariByKategori(String kategori) {
        List<Produk> hasil = new ArrayList<>();
        for (Produk p : data.values()) {
            if (p.kategori().equals(kategori)) {
                hasil.add(p);
            }
        }
        return hasil;
    }

    @Override
    public List<Produk> cariHargaDiBawah(int batas) {
        List<Produk> hasil = new ArrayList<>();
        for (Produk p : data.values()) {
            if (p.harga() < batas) {
                hasil.add(p);
            }
        }
        return hasil;
    }

    @Override
    public List<Produk> cariKataKunci(String kata) {
        String kunci = kata.toLowerCase(Locale.ROOT);
        List<Produk> hasil = new ArrayList<>();
        for (Produk p : data.values()) {
            if (p.nama().toLowerCase(Locale.ROOT).contains(kunci)) {
                hasil.add(p);
            }
        }
        return hasil;
    }

    @Override
    public boolean hapus(Produk p) {
        return data.remove(p.id(), p);
    }
}
