using System.Collections.Generic;
using System.Threading.Tasks;
using static TaxCalculatorInterviewTests.TaxCalculator;
namespace TaxCalculatorInterviewTests
static void Main(string[] args)
TaxCalculator taxCalculator = new TaxCalculator();
taxCalculator.SetCustomTaxRate(Commodity.Transport, 10);
public interface ITaxCalculator
double GetStandardTaxRate(Commodity commodity);
void SetCustomTaxRate(Commodity commodity, double rate);
double GetTaxRateForDateTime(Commodity commodity, DateTime date);
double GetCurrentTaxRate(Commodity commodity);
public class TaxCalculator : ITaxCalculator
public double GetStandardTaxRate(Commodity commodity)
if (commodity == Commodity.Default)
if (commodity == Commodity.Alcohol)
if (commodity == Commodity.Food)
if (commodity == Commodity.FoodServices)
if (commodity == Commodity.Literature)
if (commodity == Commodity.Transport)
if (commodity == Commodity.CulturalServices)
private static readonly object _customRatesLock = new object();
public void SetCustomTaxRate(Commodity commodity, double rate)
_customRates[commodity] = Tuple.Create(DateTime.Now, rate);
static Dictionary<Commodity, Tuple<DateTime, double>> _customRates = new Dictionary<Commodity, Tuple<DateTime, double>>();
public double GetTaxRateForDateTime(Commodity commodity, DateTime date)
if (_customRates.ContainsKey(commodity))
var customRate = _customRates[commodity];
if (customRate.Item1 <= date)
return GetStandardTaxRate(commodity);
public double GetCurrentTaxRate(Commodity commodity)
if (_customRates.ContainsKey(commodity))
var customRate = _customRates[commodity];
if (customRate.Item1 <= DateTime.UtcNow)
return GetStandardTaxRate(commodity);