--[[
 * Класс BlackBarBase описывает базовую часть элемента Gui, отвечающего за отображением так называемых BBT.
 * BBT (Black Bar Text) - короткие сообщения, которые выводятся в ответ на определенные действия игрока на сцене.
 * Целью данных сообщений является дать игроку какие-либо подсказки.
 * От класса BlackBarBase должен унаследыватсья BlackBar, который создается в PanelBase.
--]]

class 'BlackBarBase' (Node)

function BlackBarBase:__init(panel)
	Node.__init(self, panel:getMainEntity(), 'BlackBar', 3)
	self.game_scene = panel.game_scene

	if self.CreateLoaderTable then
        local resourceTable = self:CreateLoaderTable()
        LoadScene(self.main_entity, resourceTable)
    end
    
    self:getMainEntity():setRespondable(false)

    self.bar       = self:getEntityNamed('black_bar')
    self.textField = self:getEntityNamed('text_field')
    self.bVisible  = false

	self.indentY    = 28		--[[ Сумарный отступ от текста к краям плашки BBT.
								     Добавляется к высоте текста при перерасчете позиции
								     плашки в отображенном состоянии. Расчет происходит перед
								     отображением текста в методе "recalcShowPosition".
								--]]
	self.momentumY  = 5			-- Велечина, на которую плашка инерционно "перелитает" свою позицию.
    self.minHeight  = 64		-- Минимальная высота плашки BBT.
    self.appearTime = 0.3		-- Время появления/ищезновения плашки BBT и текста.

    self.showPosition = Vector2f( self.bar:getX(), self.minHeight)	-- Позиция BBT в отображенном состоянии.
    self.hidePosition = Vector2f( self.bar:getX(), 0)				-- Позиция BBT в скрытом состоянии.
end
-------------------------------------------------------------------------------

--[[
 * Показать текст в BBT.
 * @param	textKey		Текстовый ключ или непосредственно текст, который нужно вывести в BBT.
 * @param	bTextAsIs	Если true, то переданый текст выведется "как есть", иначе - будет восприниматья
 *						как текстовый ключ и бедет браться через StringManager. Второй варинт - по-умолчанию.
--]]
function BlackBarBase:showText(textKey, bTextAsIs)
	local text = (bTextAsIs) and textKey or StringManager:getString(textKey)

    self.textField:setText(text)
	self.textField:destroyEffectors()
	self.textField:ChangeOpacity(nil, 1, self.appearTime)

	AddUniqueGameState(BLACK_BAR_SHOWN, textKey)

    self:recalcShowPosition()
    self:moveIn(self.appearTime)
    self.bVisible = true
end
-------------------------------------------------------------------------------

--[[
 * Спрятать BBT.
 * @param	bInstantly		Если true, то BBT будет спрятан сразу (с нулевым временем).
 --]]
function BlackBarBase:hideText(bInstantly)
	local time = bInstantly and 0 or self.appearTime

	self.textField:destroyEffectors()
	self.textField:ChangeOpacity(nil, 0, time)

	self:moveOut(time)
	self.bVisible = false
end
-------------------------------------------------------------------------------

--[[
 * Является ли BBT в отображенном состоянии.
--]]
function BlackBarBase:isVisible()
    return self.bVisible
end
-------------------------------------------------------------------------------

--[[
 * Перерасчет позиции/размеров плашки BBT в отображенном состоянии.
 * Вызывается непосредственно ПЕРЕД отображением BBT, когда текст уже установлен.
--]]
function BlackBarBase:recalcShowPosition()
	local textHeight = self.textField:getBoundingBox():getHeight()
	local height     = math.max(self.minHeight, textHeight + self.indentY)
	
	self.showPosition.y = height - self.momentumY
end
-------------------------------------------------------------------------------

--[[
 * Метод, описывающий механику отображения элемента Gui BBT. Должен вызываться для
 * отображения BBT после установки всех необходимык параметров.
 * @param	time	Время, за которое BBT отобразится.
--]]
function BlackBarBase:moveIn(time)
	self:show()
	self.bar:destroyEffectors()

	if time == 0 then
		self.bar:setXY(self.showPosition.x, self.showPosition.y)
	else
		local eff = CreateAnimationEffector()
        eff:setDestroysOnEnd(true)
		eff:attachTo(self.bar)
		eff:setMode(_ANIM_FWD)

		eff:setKey(_TRACK_X, 0, self.bar:getX())
		eff:setKey(_TRACK_Y, 0, self.bar:getY())

		eff:setKey(_TRACK_Y, time * 0.7, self.showPosition.y + self.momentumY)
		eff:setKey(_TRACK_X, time,       self.showPosition.x)
		eff:setKey(_TRACK_Y, time,       self.showPosition.y)
		eff:play()
	end
end
-------------------------------------------------------------------------------

--[[
 * Метод, описывающий механику скрытия элемента Gui BBT. Первый раз вызывается при создании
 * сцены. Должен вызываться для скрытия BBT.
 * @param	time	Время, за которое BBT скроется.
--]]
function BlackBarBase:moveOut(time)
	self.bar:destroyEffectors()

	if time == 0 then
		self.bar:setXY(self.hidePosition.x, self.hidePosition.y)
		self:hide()
	else
		local eff = self.bar:MoveTo(self.hidePosition.x, self.hidePosition.y, time)
		
		eff.onFinish:add(function()
							self:hide()
						 end)
	end
end
-------------------------------------------------------------------------------