public class SemVer {

    public static void main(String[] args) {
        System.out.println("== perbandingan numerik per komponen ==");
        System.out.println(verdict("2.9.1", "2.10.0"));
        System.out.println(verdict("1.4.2", "1.4.3"));
        System.out.println(verdict("3.0.0", "3.0.0"));
        System.out.println();
        System.out.println("perbandingan string mentah: \"2.10.0\" vs \"2.9.1\" -> "
                + ("2.10.0".compareTo("2.9.1") < 0
                        ? "\"2.10.0\" dianggap lebih tua (kesimpulan salah)"
                        : "\"2.10.0\" lebih baru"));
        System.out.println();

        System.out.println("== klasifikasi kenaikan dari 1.4.2 ==");
        klasifikasi("1.4.2", "1.4.3");
        klasifikasi("1.4.2", "1.5.0");
        klasifikasi("1.4.2", "2.0.0");
    }

    private static String verdict(String a, String b) {
        int hasil = bandingkan(urai(a), urai(b));
        if (hasil < 0) {
            return a + " vs " + b + " -> " + b + " lebih baru";
        }
        if (hasil > 0) {
            return a + " vs " + b + " -> " + a + " lebih baru";
        }
        return a + " vs " + b + " -> keduanya sama";
    }

    /** "2.10.0" menjadi [2, 10, 0]. */
    private static int[] urai(String versi) {
        String[] bagian = versi.split("\\.");
        int[] angka = new int[bagian.length];
        for (int i = 0; i < bagian.length; i++) {
            angka[i] = Integer.parseInt(bagian[i]);
        }
        return angka;
    }

    /** Bandingkan komponen dari kiri: major, lalu minor, lalu patch. */
    private static int bandingkan(int[] a, int[] b) {
        for (int i = 0; i < Math.min(a.length, b.length); i++) {
            if (a[i] != b[i]) {
                return Integer.compare(a[i], b[i]);
            }
        }
        return Integer.compare(a.length, b.length);
    }

    private static void klasifikasi(String dari, String ke) {
        int[] a = urai(dari);
        int[] b = urai(ke);
        if (b[0] > a[0]) {
            System.out.printf("ke %-6s -> MAJOR : perubahan yang merusak kompatibilitas%n", ke);
        } else if (b[1] > a[1]) {
            System.out.printf("ke %-6s -> MINOR : fitur baru, kompatibel mundur%n", ke);
        } else {
            System.out.printf("ke %-6s -> PATCH : perbaikan bug, kompatibel%n", ke);
        }
    }
}
