import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;

public class DiskonStrategi {
    public static void main(String[] args) {
        long[] subtotals = { 50_000, 150_000, 600_000, 1_200_000 };

        // Objek strategi: algoritma dikemas sebagai nilai yang bisa dipilih runtime
        List<StrategiDiskon> daftarStrategi = List.of(
                new DiskonReguler(),
                new DiskonBertingkat(),
                new DiskonMalam());

        for (StrategiDiskon strategi : daftarStrategi) {
            System.out.println("== " + strategi.nama() + " ==");
            for (long subtotal : subtotals) {
                System.out.println(String.format(Locale.US,
                        "  Rp%,10d -> potongan Rp%,8d", subtotal, strategi.potongan(subtotal)));
            }
        }

        // Comparator adalah strategy bawaan JDK: algoritma urut ditukar tanpa menyentuh data
        List<Produk> produk = new ArrayList<>(List.of(
                new Produk("Pena", 12_000),
                new Produk("Buku", 85_000),
                new Produk("Tas", 250_000)));

        produk.sort(Comparator.comparingLong(Produk::harga));
        System.out.println("termurah dulu : " + produk);

        produk.sort(Comparator.comparingLong(Produk::harga).reversed());
        System.out.println("termahal dulu : " + produk);
    }
}

interface StrategiDiskon {
    String nama();

    long potongan(long subtotal);
}

class DiskonReguler implements StrategiDiskon {
    @Override
    public String nama() {
        return "DiskonReguler";
    }

    @Override
    public long potongan(long subtotal) {
        return 0; // pelanggan reguler tidak menerima potongan
    }
}

class DiskonBertingkat implements StrategiDiskon {
    @Override
    public String nama() {
        return "DiskonBertingkat";
    }

    @Override
    public long potongan(long subtotal) {
        if (subtotal >= 1_000_000) {
            return subtotal / 10;       // tingkat tiga: 10%
        }
        if (subtotal >= 500_000) {
            return subtotal / 20;       // tingkat dua: 5%
        }
        if (subtotal >= 100_000) {
            return subtotal / 100 * 3;  // tingkat satu: 3%
        }
        return 0;
    }
}

class DiskonMalam implements StrategiDiskon {
    @Override
    public String nama() {
        return "DiskonMalam";
    }

    @Override
    public long potongan(long subtotal) {
        return subtotal >= 500_000 ? 50_000 : 0; // potongan tetap untuk belanja besar
    }
}

record Produk(String nama, long harga) {
    @Override
    public String toString() {
        return nama + "(Rp" + harga + ")";
    }
}
