import collections

class ShoppingCard():


    def __init__(self, tours, buyNgetM, bulkDiscount, freeTour):
        self.tours = tours
        self.buyNgetM = buyNgetM
        self.bulkDiscount = bulkDiscount
        self.freeTour = freeTour

    def calc_price(self, userInput):
        orders = userInput.split()
        cOrders = collections.Counter(orders)

        for t, n, m in self.buyNgetM:
                if int(cOrders[t] - (cOrders[t] / m)) != 0 and cOrders[t] >= m:
                    cOrders[t] = int(cOrders[t] - (cOrders[t] / m))

        for buy, free in self.freeTour:
            if free in cOrders:
                cOrders[free] = cOrders[free] -cOrders[buy]
                if cOrders[free] < 0:
                    del cOrders[free]

        price = 0
        for k, v in cOrders.items():
            if v != 0:
                price += self.tours[k]*v

        for t, n, discount in self.bulkDiscount:
            if t in cOrders and cOrders[t] > n:
                price -= cOrders[t]*discount

        return price

    def buy_n_get_m(self, tour, n, m):
        self.buyNgetM.append([tour, n, m])

    def add_bulk_discount(self, tour, n, discount):
        self.bulkDiscount.append([tour, n, discount])

    def free_for_sold(self, buyT, freeT):
        self.freeTour.append([buyT, freeT])

    def add(self, tour, price):
        self.tours[tour] = price


database = {'OH': 300.00, 'BC': 110.00, 'SK': 30.00}
rBuyNgetM = [['OH', 2, 3]]
rBulkDiscount = [['BC', 4, 20.00]]
rfreeTour = [['OH', 'SK']]
sp = ShoppingCard(database, rBuyNgetM, rBulkDiscount, rfreeTour)
print(sp.calc_price('OH OH OH BC'))
print(sp.calc_price('OH SK'))
print(sp.calc_price('BC BC BC BC BC OH'))
print(sp.calc_price('OH OH OH BC SK'))
print(sp.calc_price('OH BC BC SK SK'))
print(sp.calc_price('BC BC BC BC BC BC OH OH'))
print(sp.calc_price('SK SK BC'))
sp.add('AA', 200.00)
sp.add('BB', 1350.00)
print(sp.calc_price('OH OH AA AA AA'))
print(sp.calc_price('AA BB OH'))