import java.util.List;

public class ShippingDemo {
    public static void main(String[] args) {
        Money soles5 = Money.of(500, "PEN");
        List<ShippingRate> rates = List.of(
                new FlatRate(Money.of(1000, "PEN")),
                new ByWeight(soles5, Money.of(300, "PEN")),
                new FreeAbove(Money.of(15000, "PEN"), new ByWeight(soles5, Money.of(300, "PEN"))));

        Parcel small = new Parcel(800, Money.of(4590, "PEN"));
        Parcel heavy = new Parcel(3200, Money.of(18000, "PEN"));
        for (ShippingRate rate : rates) {
            IO.println(rate);
            IO.println("  pequeño: " + rate.cost(small) + "   pesado: " + rate.cost(heavy));
        }

        // Una strategy simple también puede ser una lambda.
        ShippingRate pickup = parcel -> Money.zero();
        Checkout checkout = new Checkout(rates.get(1));
        IO.println("total por peso: " + checkout.total(heavy));
        checkout.setRate(pickup);
        IO.println("total en tienda: " + checkout.total(heavy));

        // La versión con switch da lo mismo, pero cada tarifa nueva la obliga a cambiar.
        IO.println("switch, pesado por peso: " + ShippingSwitch.cost("weight", heavy));
    }
}
