package org.javamoney.examples.jaxrs.ecommerce;
import java.util.List;
import javax.enterprise.inject.Vetoed;
import javax.money.CurrencyUnit;
import javax.money.MonetaryAmount;
import org.javamoney.examples.jaxrs.model.Product;
import org.javamoney.examples.jaxrs.resources.store.Mock;
import org.javamoney.moneta.FastMoney;
import org.javamoney.moneta.function.MonetaryFunctions;
import org.javamoney.moneta.function.MonetarySummaryStatistics;
@Vetoed
class ECommerceImpl implements Ecommerce {
private CurrencyUnit currency;
private MonetaryAmount zero;
public ECommerceImpl(CurrencyUnit currency) {
this.currency = currency;
zero = FastMoney.of(0, currency);
}
@Override
public List<Product> products() {
return Mock.hello(currency);
}
@Override
public MonetaryAmount buy(List<Product> products) {
return products.stream().map(Product::getPrice)
.reduce(MonetaryFunctions.sum()).orElse(zero);
}
@Override
public MonetaryAmount average(List<Product> products) {
MonetarySummaryStatistics summary = products.stream().map(Product::getPrice)
.collect(MonetaryFunctions.summarizingMonetary(currency));
return summary.getAvarage();
}
@Override
public MonetaryAmount cheaper(List<Product> products) {
return products.stream().map(Product::getPrice)
.reduce(MonetaryFunctions.min()).orElse(zero);
}
@Override
public MonetaryAmount expensive(List<Product> products) {
return products.stream().map(Product::getPrice)
.reduce(MonetaryFunctions.max()).orElse(zero);
}
@Override
public String summary(List<Product> products) {
MonetarySummaryStatistics summary = products.stream().map(Product::getPrice)
.collect(MonetaryFunctions.summarizingMonetary(currency));
StringBuilder summaryText = new StringBuilder();
summaryText.append("Cheaper price: ").append(summary.getMin());
summaryText.append("\nExpensive price: ").append(summary.getMax());
summaryText.append("\nAvarage price: ").append(summary.getAvarage());
summaryText.append("\nSum price: ").append(summary.getSum());
summaryText.append("\nCount: ").append(summary.getCount());
return summaryText.toString();
}
}