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

public class KalkulatorCicilan {
    public static void main(String[] args) {
        CicilanService layanan = new CicilanService();
        RiwayatPinjaman riwayat = new RiwayatPinjaman();
        TampilanCicilan tampilan = new TampilanCicilan();

        Pinjaman pinjaman = new Pinjaman("Budi", 12_000_000, 12, 0.06);
        double angsuran = layanan.angsuranBulanan(pinjaman);
        riwayat.simpan(pinjaman, angsuran);

        System.out.println(tampilan.ringkasan(pinjaman, angsuran));
        System.out.println("Tersimpan: " + riwayat.jumlah() + " pinjaman");
    }
}

// Concern 1: aturan bisnis pinjaman
record Pinjaman(String nama, long pokok, int tenor, double bungaTahunan) {
}

class CicilanService {
    double angsuranBulanan(Pinjaman p) {
        double i = p.bungaTahunan() / 12;
        if (i == 0) {
            return (double) p.pokok() / p.tenor();
        }
        return p.pokok() * i / (1 - Math.pow(1 + i, -p.tenor()));
    }
}

// Concern 2: penyimpanan data
class RiwayatPinjaman {
    private final List<String> catatan = new ArrayList<>();

    void simpan(Pinjaman p, double angsuran) {
        catatan.add(p.nama() + "|" + p.pokok() + "|" + angsuran);
    }

    int jumlah() {
        return catatan.size();
    }
}

// Concern 3: penyajian ke pengguna
class TampilanCicilan {
    String ringkasan(Pinjaman p, double angsuran) {
        return String.format("%s meminjam Rp%d selama %d bulan%nAngsuran: Rp%.0f per bulan",
                p.nama(), p.pokok(), p.tenor(), angsuran);
    }
}
