package com.piggymetrics.statistics.service; import com.google.common.collect.ImmutableMap; import com.piggymetrics.statistics.client.ExchangeRatesClient; import com.piggymetrics.statistics.domain.Currency; import com.piggymetrics.statistics.domain.ExchangeRatesContainer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.Assert; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDate; import java.util.Map; @Service public class ExchangeRatesServiceImpl implements ExchangeRatesService { private static final Logger log = LoggerFactory.getLogger(ExchangeRatesServiceImpl.class); private ExchangeRatesContainer container; @Autowired private ExchangeRatesClient client; /** * {@inheritDoc} */ @Override public Map<Currency, BigDecimal> getCurrentRates() { if (container == null || !container.getDate().equals(LocalDate.now())) { container = client.getRates(Currency.getBase()); log.info("exchange rates has been updated: {}", container); } return ImmutableMap.of( Currency.EUR, container.getRates().get(Currency.EUR.name()), Currency.RUB, container.getRates().get(Currency.RUB.name()), Currency.USD, BigDecimal.ONE ); } /** * {@inheritDoc} */ @Override public BigDecimal convert(Currency from, Currency to, BigDecimal amount) { Assert.notNull(amount); Map<Currency, BigDecimal> rates = getCurrentRates(); BigDecimal ratio = rates.get(to).divide(rates.get(from), 4, RoundingMode.HALF_UP); return amount.multiply(ratio); } }