import java.util.List;

/** Matriks rilis: jenis perubahan menentukan nomor versi, kanal, dan jalur mundur. */
public class MatriksRilis {

    /** Jenis perubahan sejak rilis terakhir — bahasa Semantic Versioning. */
    enum Jenis { PATCH, MINOR, MAJOR }

    /** Satu perubahan masuk rilis berikutnya. */
    record Perubahan(Jenis jenis, String contoh) {}

    /** Naikkan versi sesuai jenis perubahan: patch +1, minor +1 & patch reset, major +1 & sisanya reset. */
    static String versiBerikutnya(String versi, Jenis jenis) {
        String[] angka = versi.split("\\.");
        int mayor = Integer.parseInt(angka[0]);
        int minor = Integer.parseInt(angka[1]);
        int patch = Integer.parseInt(angka[2]);
        return switch (jenis) {
            case PATCH -> mayor + "." + minor + "." + (patch + 1);
            case MINOR -> mayor + "." + (minor + 1) + ".0";
            case MAJOR -> (mayor + 1) + ".0.0";
        };
    }

    /** Satu lingkungan dalam rantai promosi: nama dan peran pemeriksaannya. */
    record Lingkungan(String nama, String gerbang) {}

    public static void main(String[] args) {
        String versiKini = "2.1.0";
        List<Perubahan> perubahan = List.of(
                new Perubahan(Jenis.PATCH, "perbaiki kwitansi terpotong"),
                new Perubahan(Jenis.MINOR, "laporan penjualan harian"),
                new Perubahan(Jenis.MAJOR, "API pesanan berubah bentuk"));

        System.out.println("== Matriks versi dari " + versiKini + " ==");
        System.out.printf("%-7s %-30s %-10s %s%n", "jenis", "contoh perubahan", "versi", "arti bagi pengguna");
        for (Perubahan p : perubahan) {
            String arti = switch (p.jenis()) {
                case PATCH -> "aman diperbarui (bugfix)";
                case MINOR -> "aman; fitur baru tersedia";
                case MAJOR -> "perlu penyesuaian konsumen API";
            };
            System.out.printf("%-7s %-30s %-10s %s%n",
                    p.jenis(), p.contoh(), versiBerikutnya(versiKini, p.jenis()), arti);
        }
        System.out.println();

        List<Perubahan> rilisBerikut = List.of(
                new Perubahan(Jenis.MINOR, "laporan penjualan harian"),
                new Perubahan(Jenis.PATCH, "perbaiki kwitansi terpotong"));
        String target = versiBerikutnya(versiKini, rilisBerikut.get(0).jenis());
        System.out.println("== Rilis berikutnya: v" + target + " ==");
        for (Perubahan p : rilisBerikut) {
            System.out.println("  perubahan: [" + p.jenis() + "] " + p.contoh());
        }
        System.out.println("  nomor versi ditetapkan dari jenis terbesar: " + target);
        System.out.println();

        System.out.println("== Promosi artefak yang sama lintas lingkungan ==");
        String cerna = "sha256:7f3c19ab"; // sidik jari artefak — identik di seluruh lingkungan
        List<Lingkungan> rantai = List.of(
                new Lingkungan("ci", "pengujian otomatis lulus"),
                new Lingkungan("staging", "pemeriksaan manual + uji beban"),
                new Lingkungan("produksi", "metrik sehat pasca rollout"));
        for (Lingkungan l : rantai) {
            System.out.printf("  %-9s %s  %s%n", l.nama(), cerna, "(" + l.gerbang() + ")");
        }
        System.out.println();

        System.out.println("== Strategi rollout dan jalur mundur ==");
        System.out.printf("%-12s %-22s %s%n", "strategi", "cakupan awal", "jalur mundur");
        System.out.printf("%-12s %-22s %s%n", "big-bang", "100% seketika", "redeploy versi lama");
        System.out.printf("%-12s %-22s %s%n", "rolling", "pod bergantian", "pulihkan pod lama bertahap");
        System.out.printf("%-12s %-22s %s%n", "blue-green", "saklar penuh ke hijau", "alihkan balik ke biru");
        System.out.printf("%-12s %-22s %s%n", "canary", "1-5% trafik", "hentikan canary, trafik tetap di stabil");
    }
}
