import java.util.List;

public class BuktiRefactoring {
    public static void main(String[] args) {
        List<String> keranjang = List.of("Buku", "Pena", "Penghapus");
        int[] harga = {25000, 5000, 3000};

        StringBuilder jejakLama = new StringBuilder();
        versiLama(keranjang, harga, jejakLama);

        StringBuilder jejakBaru = new StringBuilder();
        versiBaru(keranjang, harga, jejakBaru);

        System.out.println("== Versi lama ==");
        System.out.print(jejakLama);
        System.out.println("== Versi baru ==");
        System.out.print(jejakBaru);
        System.out.println("Perilaku identik: "
                + jejakLama.toString().equals(jejakBaru.toString()));
    }

    // Versi lama: satu blok panjang, banyak tanggung jawab sekaligus
    static void versiLama(List<String> keranjang, int[] harga, StringBuilder jejak) {
        int total = 0;
        for (int i = 0; i < keranjang.size(); i++) {
            total += harga[i];
        }
        double diskon = 0;
        if (total >= 30000) {
            diskon = total * 0.1;
        }
        jejak.append("item: ").append(keranjang.size()).append('\n');
        jejak.append("total: ").append(total).append('\n');
        jejak.append("diskon: ").append((int) diskon).append('\n');
        jejak.append("bayar: ").append((int) (total - diskon)).append('\n');
    }

    // Versi baru: nama bermakna + method kecil dengan satu tanggung jawab
    static void versiBaru(List<String> keranjang, int[] harga, StringBuilder jejak) {
        int total = hitungTotal(harga);
        int diskon = hitungDiskon(total);

        jejak.append("item: ").append(keranjang.size()).append('\n');
        jejak.append("total: ").append(total).append('\n');
        jejak.append("diskon: ").append(diskon).append('\n');
        jejak.append("bayar: ").append(total - diskon).append('\n');
    }

    static int hitungTotal(int[] harga) {
        int total = 0;
        for (int h : harga) {
            total += h;
        }
        return total;
    }

    static int hitungDiskon(int total) {
        if (total >= 30000) {
            return (int) (total * 0.1);
        }
        return 0;
    }
}
