public class NormalisasiKode {
    public static void main(String[] args) {
        // Cuplikan dengan indentasi campuran: 2 spasi, 6 spasi, 8 spasi
        String kotor = "class Demo {\n"
                + "  int total;\n"
                + "\n"
                + "      void hitung(int a, int b) {\n"
                + "            total = a + b;\n"
                + "  }\n"
                + "}\n";

        System.out.println("Sebelum (indentasi campuran):");
        System.out.print(kotor);
        System.out.println("(akhir cuplikan)");

        String bersih = normalisasi(kotor);
        System.out.println("Sesudah (indentasi 4 spasi):");
        System.out.print(bersih);
        System.out.println("(akhir cuplikan)");
    }

    static String normalisasi(String kode) {
        String[] baris = kode.split("\n", -1);
        StringBuilder hasil = new StringBuilder();
        int kedalaman = 0;
        boolean kosongSebelumnya = false;

        for (String mentah : baris) {
            String b = mentah.trim();

            // Baris kosong berurutan diringkas menjadi satu
            if (b.isEmpty()) {
                if (!kosongSebelumnya && hasil.length() > 0) {
                    hasil.append('\n');
                    kosongSebelumnya = true;
                }
                continue;
            }
            kosongSebelumnya = false;

            // Kurung tutup menutup satu tingkat sebelum baris dicetak
            if (b.startsWith("}")) {
                kedalaman = Math.max(0, kedalaman - 1);
            }
            hasil.append("    ".repeat(kedalaman)).append(b).append('\n');

            // Hitung perubahan kedalaman dari kurung pada baris ini
            int buka = b.length() - b.replace("{", "").length();
            int tutup = b.length() - b.replace("}", "").length();
            kedalaman += buka - tutup;
        }

        return hasil.toString().stripTrailing() + "\n";
    }
}
