import java.util.Map;
import java.util.Optional;

public class KonfigurasiAman {

    static final Map<String, String> KONFIGURASI = Map.of(
        "nama-toko", "Toko Serba Ada",
        "mata-uang", "IDR",
        "port", "8080",
        "timeout-detik", "abc"
    );

    // ofNullable menampung hasil Map.get yang bisa menghasilkan null
    static Optional<String> ambil(String kunci) {
        return Optional.ofNullable(KONFIGURASI.get(kunci));
    }

    // Parsing yang gagal menghasilkan Optional.empty, bukan exception
    static Optional<Integer> angka(String teks) {
        try {
            return Optional.of(Integer.parseInt(teks));
        } catch (NumberFormatException e) {
            return Optional.empty();
        }
    }

    public static void main(String[] args) {
        System.out.println("nama-toko     = " + ambil("nama-toko"));
        System.out.println("logo-toko     = " + ambil("logo-toko"));

        // ifPresentOrElse: dua cabang eksplisit, hadir atau kosong
        ambil("mata-uang").ifPresentOrElse(
            uang -> System.out.println("mata-uang     = " + uang),
            () -> System.out.println("mata-uang     = (tidak diatur)"));

        // orElseThrow: nilai wajib hadir, ketiadaan berarti galat
        String nama = ambil("nama-toko")
            .orElseThrow(() -> new IllegalStateException("nama-toko wajib diatur"));
        System.out.println("nama          = " + nama);

        // flatMap: menyambung dua langkah yang sama-sama Optional
        Optional<Integer> port = ambil("port").flatMap(KonfigurasiAman::angka);
        System.out.println("port          = " + port);

        Optional<Integer> timeout = ambil("timeout-detik").flatMap(KonfigurasiAman::angka);
        System.out.println("timeout-detik = " + timeout + " (gagal di-parse)");
    }
}
