require 'csv'
##Operations/IO
module Reader
def self.load_hotels_csv(filename)
hotels = {}
CSV.foreach(filename, :headers => true, :header_converters => :symbol) do |row|
hotels[row[:name].downcase.to_sym] = Hotel.new(row)
end
hotels
end
def self.inputs
parameters = gets.chomp.gsub(/\W\s+|(\([a-z]*\)|,|\s)/, ' ').split(/\s/).reject!(&:empty?)
p parameters
# parameters = parameters.gsub(/\W\s+|(\([a-z]*\)|,|\s)/, ' ').split(/\s/)
end
end
##Hotel
class Hotel
attr_reader :name, :rating, :regular_weekday, :regular_weekend, :rewards_weekday, :rewards_weekend
def initialize(hotel)
@name = hotel[:name]
@rating = hotel[:rating]
@regular_weekday = hotel[:regular_weekday]
@regular_weekend = hotel[:regular_weekend]
@rewards_weekday = hotel[:rewards_weekday]
@rewards_weekend = hotel[:rewards_weekend]
end
def to_hash
hash = {}
instance_variables.each {|var| hash[var.to_s.delete("@")] = instance_variable_get(var) }
hash
end
def self.return_rates(parameters, hotels)
if parameters[0].downcase == "regular"
parameters[1..-1].each do |day|
puts weekend?(day) ? cheapest('regular_weekend', hotels) : cheapest('regular_weekday', hotels)
end
elsif parameters[0].downcase == "rewards"
parameters[1..-1].each do |day|
puts weekend?(day) ? cheapest('rewards_weekend', hotels) : cheapest('rewards_weekday', hotels)
end
else
p "invalid input"
end
end
def self.weekend?(day)
day = day.split(/(\D{3,})/).reverse
day = Time.utc(*day)
p day
return day.saturday? || day.sunday?
end
def self.cheapest(key, hotels)
rates = []
hotels.each_value do |hotel|
rates << hotel[key]
end
p rates.join(' ')
end
end
module Booking
extend Reader
def self.run
hotels = Reader.load_hotels_csv("hotels.csv").to_hash
puts "Enter a customer type (Regular or Rewards) and desired dates (DayMonthYear format please):"
parameters = Reader.inputs
hotels.each_value do |hotel|
Hotel.return_rates(parameters, hotels)
end
puts "Check other rates? Enter 'y' if so."
affirm = gets.chomp
while affirm.downcase == 'y'
puts "Enter details:\n"
Hotel.return_rates(Reader.inputs)
puts "Check other rates? Enter 'y' if so."
affirm = gets.chomp
end
end
end
Booking.run
# sample output + error thrown:
#Enter a customer type (Regular or Rewards) and desired dates (DayMonthYear format please):
#Rewards: 26Mar2009(thur), 27Mar2009(fri), 28Mar2009(sat)
#["Rewards", "26Mar2009", "27Mar2009", "28Mar2009"]
#2009-03-26 00:00:00 UTC
#reservations2.rb:69:in `block in cheapest': undefined method `[]' for #<Hotel:0x007f84db829530> (NoMethodError)
# from reservations2.rb:68:in `each_value'
# from reservations2.rb:68:in `cheapest'
# from reservations2.rb:51:in `block in return_rates'
# from reservations2.rb:50:in `each'
# from reservations2.rb:50:in `return_rates'
# from reservations2.rb:86:in `block in run'
# from reservations2.rb:85:in `each_value'
# from reservations2.rb:85:in `run'
# from reservations2.rb:102:in `<main>'