import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public class BacaKonfigurasi {

    // Binding type-safe: mirror record @ConfigurationProperties(prefix = "spring.datasource")
    record KonfigurasiDataSource(String url, String username, int maximumPoolSize) { }

    public static void main(String[] args) {
        // Isi application.properties yang ditulis pengembang.
        List<String> applicationProperties = List.of(
                "spring.application.name=layanan-pesanan",
                "spring.datasource.url=jdbc:h2:mem:demo",
                "spring.datasource.username=sa",
                "spring.datasource.hikari.maximum-pool-size=8",
                "server.port=8080");

        Map<String, String> properti = new LinkedHashMap<>();
        for (String baris : applicationProperties) {
            int idx = baris.indexOf('=');
            properti.put(baris.substring(0, idx), baris.substring(idx + 1));
        }

        // Variabel lingkungan menimpa berkas (relaxed binding):
        // SPRING_DATASOURCE_USERNAME -> spring.datasource.username
        String dariEnv = kunciDariEnv("SPRING_DATASOURCE_USERNAME");
        properti.put(dariEnv, "budi_prod");

        System.out.println("== konfigurasi efektif setelah override ==");
        properti.forEach((k, v) -> System.out.println(k + " = " + v));

        // Binding nilai ke record: satu tipe, sekali baca.
        KonfigurasiDataSource ds = new KonfigurasiDataSource(
                properti.get("spring.datasource.url"),
                properti.get("spring.datasource.username"),
                Integer.parseInt(properti.get("spring.datasource.hikari.maximum-pool-size")));

        System.out.println();
        System.out.println("== binding type-safe ke record ==");
        System.out.println(ds);
        System.out.println();
        System.out.println("pool minimum 2 koneksi: "
                + (ds.maximumPoolSize() >= 2 ? "memenuhi" : "terlalu kecil"));
    }

    static String kunciDariEnv(String variabelLingkungan) {
        return variabelLingkungan.toLowerCase().replace('_', '.');
    }
}
