------------------------------------------------------------------------------
-- class 'AchievmentsManager'
-- Функционал ачивок построен на событиях. В игровых скритах в необходимых
-- местах делается вызов achievement_manager_instance:handleEvent(event_name),
-- который вызывает эту функцию для всех зарегестрированных ачивок, которые,
-- в свою очередь, могут иметь обработчик для данного события.
------------------------------------------------------------------------------

class 'AchievmentsManager'

------------------------------------------------------------------------------
function AchievmentsManager:__init(game_scene)
	self.game_scene = game_scene
	self.achievments = {}
end

------------------------------------------------------------------------------
function AchievmentsManager:handleEvent(event_name, args)
	local callback = args and table.has_key(args, 'callback') and args['callback']
	for name, achievment in pairs(self.achievments) do
		if not achievment:isCompleted() then
			achievment:handleEvent(event_name, args)
		end
	end
	self:unlockCompletedAchievments(callback)
end

------------------------------------------------------------------------------
function AchievmentsManager:addAchievment(achievment)
	self.achievments[achievment:getName()] = achievment
end

------------------------------------------------------------------------------
function AchievmentsManager:unlockCompletedAchievments(callback)
	local has_unlocked_achievments = false
	for name, achievment in pairs(self.achievments) do
		if achievment:isCompleted() and not achievment:isUnlocked() then
			achievment:unlock(function() self:unlockCompletedAchievments(callback) end )
			has_unlocked_achievments = true
			break
		end
	end

	if not has_unlocked_achievments and callback then
		callback()
	end
end

------------------------------------------------------------------------------
function AchievmentsManager:getAchievment(name)
	return self.achievments[name]
end

------------------------------------------------------------------------------
function AchievmentsManager:getAchievments()
	return self.achievments
end