require 'date'

def daily_cost(start_date, end_date, time_period_costs)
  daily_cost = {}

  if start_date > end_date
    raise "Wrong time period given."
  end
  
  (start_date..end_date).each do |date|
    time_period_costs.each do |time_period_cost|
      unless time_period_cost[:cost].is_a?(Float)
        raise "Wrong cost given." 
      end

      daily_cost[date] ||= 0

      if time_period_cost[:time_period] == :daily
        daily_cost[date] = time_period_cost[:cost]
      elsif time_period_cost[:time_period] == :weekly
        daily_cost[date] += time_period_cost[:cost] / 7
      elsif time_period_cost[:time_period] == :monthly
        daily_cost[date] += time_period_cost[:cost] / days_in_month(date.year, date.month)
      else
        raise "Wrong time interval given."
      end
    end
  end

  daily_cost
end

def days_in_month(year, month)
  Date.new(year, month, -1).day
end