public static void Main()
var calculator = new SubscriptionCalculator();
var discountValue = calculator.Calculate((decimal)100.5, 2, 6);
var discountValue1 = calculator.Calculate((decimal)100.5, MembershipType.SimpleCustomer, 6);
Console.WriteLine("Discounted value for six years is " + discountValue);
Console.WriteLine("Discounted value for six years is " + discountValue1);
public class MembershipSubscriptionDiscount
private static readonly MembershipSubscriptionDiscount NotRegisteredSubscriptionDiscount = new MembershipSubscriptionDiscount(MembershipType.NotRegistered, 0);
private static readonly MembershipSubscriptionDiscount SimpleCustomerSubscriptionDiscount = new MembershipSubscriptionDiscount(MembershipType.SimpleCustomer, 10);
private static readonly MembershipSubscriptionDiscount ValuableCustomerSubscriptionDiscount = new MembershipSubscriptionDiscount(MembershipType.ValuableCustomer, 30);
private static readonly MembershipSubscriptionDiscount MostValuableCustomerSubscriptionDiscount = new MembershipSubscriptionDiscount(MembershipType.MostValuableCustomer, 50);
private static readonly MembershipSubscriptionDiscount GoldSubscriptionDiscount = new MembershipSubscriptionDiscount(MembershipType.Gold, 60);
public static readonly MembershipSubscriptionDiscount[] KnownMembershipSubscriptionDiscounts = new MembershipSubscriptionDiscount[] {
NotRegisteredSubscriptionDiscount,
SimpleCustomerSubscriptionDiscount,
ValuableCustomerSubscriptionDiscount,
MostValuableCustomerSubscriptionDiscount,
private MembershipSubscriptionDiscount(MembershipType membershipType, decimal discountRate)
MembershipType = membershipType;
DiscountRate = discountRate;
public MembershipType MembershipType { get; private set; }
public decimal DiscountRate { get; private set; }
public enum MembershipType
MostValuableCustomer = 4,
public interface ISubscriptionCalculator
decimal Calculate(decimal amount, MembershipType membershipType, int years);
decimal Calculate(decimal amount, int discountType, int years);
public class SubscriptionCalculator : ISubscriptionCalculator
public decimal Calculate(decimal amount, MembershipType membershipType, int years)
throw new ArgumentOutOfRangeException("'{nameof(amount)}' must be greater than 0.");
throw new ArgumentOutOfRangeException("'{nameof(years)}' must be greater than 0.");
var membershipSubscriptionDiscount = MembershipSubscriptionDiscount.KnownMembershipSubscriptionDiscounts.FirstOrDefault(m => m.MembershipType == membershipType);
if (membershipSubscriptionDiscount == null)
throw new ArgumentException("Unable to find subscription discount for membership type '{membershipType}'.");
var yearBasedDiscountRate = years > 5 ? (decimal) 5 / 100 : (decimal) years / 100;
return amount * (1 - membershipSubscriptionDiscount.DiscountRate / 100) * (1 - yearBasedDiscountRate);
public decimal Calculate(decimal amount, int discountType, int years)
decimal disc = (years > 5) ? (decimal)5 / 100 : (decimal)years / 100;
else if (discountType == 2)
result = (amount - (0.1m * amount)) - disc * (amount - (0.1m * amount));
else if (discountType == 3)
result = (0.7m * amount) - disc * (0.7m * amount);
else if (discountType == 4)
result = (amount - (0.5m * amount)) - disc * (amount - (0.5m * amount));