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

public class AdaptasiCuaca {
    public static void main(String[] args) {
        PenyediaCuaca[] daftarPenyedia = {
                new AdapterCuacaLawas(new LayananCuacaLawas()),
                new AdapterCuacaPusat(new PusatDataCuaca())
        };

        // Klien hanya mengenal interface PenyediaCuaca
        for (PenyediaCuaca penyedia : daftarPenyedia) {
            System.out.println(penyedia.cuacaKini("Jakarta"));
            System.out.println(penyedia.cuacaKini("Bandung"));
        }
    }
}

// Interface baru yang diinginkan kode modern
interface PenyediaCuaca {
    Cuaca cuacaKini(String kota);
}

record Cuaca(String kota, int suhuC, int kelembapanPersen) {
    @Override
    public String toString() {
        return kota + ": " + suhuC + " derajat C, lembap " + kelembapanPersen + "%";
    }
}

// Sumber lawas 1: hasil berupa string CSV "kota;suhu;kelembapan"
class LayananCuacaLawas {
    String ambilCsv(String kota) {
        return switch (kota) {
            case "Jakarta" -> "Jakarta;31;78";
            case "Bandung" -> "Bandung;24;85";
            default -> "Tidak Diketahui;0;0";
        };
    }
}

// Sumber lawas 2: format kunci-nilai dengan pemisah '|'
class PusatDataCuaca {
    String unduh(String kota) {
        return switch (kota) {
            case "Jakarta" -> "kota=Jakarta|suhu=32|lembap=80";
            case "Bandung" -> "kota=Bandung|suhu=23|lembap=90";
            default -> "kota=Tidak Diketahui|suhu=0|lembap=0";
        };
    }
}

// Adapter 1: menerjemahkan CSV menjadi objek Cuaca
class AdapterCuacaLawas implements PenyediaCuaca {
    private final LayananCuacaLawas lawas;

    AdapterCuacaLawas(LayananCuacaLawas lawas) {
        this.lawas = lawas;
    }

    @Override
    public Cuaca cuacaKini(String kota) {
        String[] bagian = lawas.ambilCsv(kota).split(";");
        return new Cuaca(bagian[0],
                Integer.parseInt(bagian[1]),
                Integer.parseInt(bagian[2]));
    }
}

// Adapter 2: menerjemahkan format kunci-nilai menjadi objek Cuaca
class AdapterCuacaPusat implements PenyediaCuaca {
    private final PusatDataCuaca pusat;

    AdapterCuacaPusat(PusatDataCuaca pusat) {
        this.pusat = pusat;
    }

    @Override
    public Cuaca cuacaKini(String kota) {
        Map<String, String> nilai = new LinkedHashMap<>();
        for (String pasangan : pusat.unduh(kota).split("\\|")) {
            String[] kunciNilai = pasangan.split("=", 2);
            nilai.put(kunciNilai[0], kunciNilai[1]);
        }
        return new Cuaca(nilai.get("kota"),
                Integer.parseInt(nilai.get("suhu")),
                Integer.parseInt(nilai.get("lembap")));
    }
}
