-- этот модуль отрисовывает прогрессбар заполнения кнопки хинт, когда она не активна
-- или в зависимости от режима он может отрисовывать обратный отсчет времени бонуса
-- модуль сам автоматически активирует кнопку если режим заполнился

-- первоначально нужно проинициализироват модуль вызовом FormHintButton с виджетом кнопки в качестве параметра
-- будет создан луа виджет внутри кнопки, который отвечает за отрисовку, кнопка будет в активном состоянии и
-- режим отрисовки будет установлен на отрисовуку прогресбара

-- Что бы иницировать заполнение прогрессбара вывается hint_button.StartHintButtonResume()
-- после этого кнопка дизейблится и будет отображать прогрессбар, позиция прогрессбара устанавливается вызовом
-- hint_button.UpdateHintButton(_progress_time) _progress_time параметр от 0 до 1 который определяет заполнение хинта
-- кода он дозодит до 1 кнопка автоматически активирется и прогрессбар прячется

-- Что бы инициировать виджет в режим отображения времени, нужно вызвать hint_button.StartBonusHintTimer()
-- после этого виджет будет выводить в секундах параметр, который был передан hint_button.UpdateHintButton(_progress_time)
-- _progress_time передается в милисекундах. Кода _progress_time становится равным 0 то кнопка активируется.

-- Одновременно текст и прогрессбар отображаться не могут, поэтому эти два вызова нейтрализуют дейсвие дргу друга

hint_button = {}

__inherite(hint_button, null_lua_widget_handler()) 

function hint_button.__CreateInstance()
    return "hint_button"
end

hint_button._show_hint_timer_mode = false   -- режим в котором отображается кнопка хинт
                                            -- если установлен, то отображаем время до конца подсказки

hint_button._image_id = "screens_game_progress_hint"          -- изображение, которым заполняется кнопка подсказки
hint_button._image_offset = sf.misc.FloatVector(0, 0)         -- смещение изображения относительно кнопки  
hint_button._font_id = "mpc_gradient_30"                      -- шрифт, которым пишется текст в кнопке
hint_button._text_offset = sf.misc.FloatVector(40, 18)        -- смещение текста в кнопке
hint_button.effect_fly_target = sf.misc.FloatVector(0, 0)     -- точка куда летит эффект хинта(позже меняется на позицию кнопки)

-- включение режима отображения времени в секундах
function hint_button.StartBonusHintTimer()
	hint_button._show_hint_timer_mode = true
	hint_button.SetHintButtonDisabled(true)
end

-- включение режима восстановления кнопки хинт
function hint_button.StartHintButtonResume()
	--hint_button._hint_resume_time = _resume_time
	hint_button._show_hint_timer_mode = false
	hint_button.SetHintButtonDisabled(true)
end

-- проверка на то что кнопка активна
function hint_button.IsHintButtonDisabled()
	return hint_button._hint_button_widget.GetButtonState() == sf.gui.CButtonWidget.StateDisabled
end

-- функция, которая дизейблит и активирует кнопку хинта
function hint_button.SetHintButtonDisabled(_is_disable)
	hint_button._show = _is_disable
	hint_button._hint_button_widget.DisableButton(_is_disable)
	hint_button._hint_button_widget.OnMouseMove(sf.misc.FloatVector(-1000, -1000), 0, true)
end

-- апдейт содержимого кнопки хинт в зависимости от времени
function hint_button.UpdateHintButton(_progress_time)
	-- то либо она в режиме отсчета времени
	if hint_button._show_hint_timer_mode then
		-- тогда мы узнаем если еще отсалось время подсказки
		if _progress_time > 1 then
			-- т овыводим его
			hint_button._text = tostring(math.ceil(_progress_time/1000))
		else
			-- иначе сбрасываем текст
			hint_button._text = nil
			-- возвращаем кнопку в обычный режим хинта
			hint_button._show_hint_timer_mode = false
			hint_button.SetHintButtonDisabled(false)
		end
		
	else
		-- если кнопка в режиме восстановления хинта, 
		-- то узнаем время до того как хинт восстановится
		if 1 - _progress_time > 0.01 then
			-- или обновляем позицию прогрессбара в кнопке
			hint_button.UpdateProgressImage(_progress_time)
			hint_button._need_finish_sound = true
		else
			-- или возвращаем кнопку в обычный режим кнопки хинт
			if hint_button._need_finish_sound then
				hint_button._need_finish_sound = nil
				__sound("hint_add")
			end
			hint_button.SetHintButtonDisabled(false)
		end
	end
end

-- формирование кнопки при запуске уровня для выбраной кнопки
function hint_button.FormHintButton(_hint_button_widget, _restore_image)
	-- определение изображение для восстановления кнопки
	local restore_image = _restore_image
	if not restore_image then
		restore_image = hint_button._image_id
	end
	
	hint_button._need_finish_sound = nil
	-- если кнопки для хинта нет, то ругаемся и выходим
	local button_widget = _hint_button_widget
	
	-- создаем новый виджет, котоырй отрисовывает вся внутри кнопки
	local resume_widget = sf.gui.CLuaWidget("hint_button_widget", 50, 0)

	-- настраиваем всякое что бы он работал
	resume_widget.SetOffset(0, 0)
	resume_widget.SetLua(g_Lua.GetId())
	resume_widget.SetOverloadTable("hint_button")
	
	-- доавляем его в кнопку
	button_widget.AddWidget(resume_widget)
	
					 
	-- флаг отвечает за отрисовку прогресс бара или текста
	hint_button._show = true

	-- размер кнопки-родителя
	hint_button._parent_size = button_widget.GetSize()

	-- изображение прогрессбара
	hint_button._image = sf.graphics.CImage(restore_image)

	local image_rect = hint_button._image.GetRect()

	-- размер изображения прогрессбара
	hint_button._image_size = sf.misc.FloatVector(image_rect.Width, image_rect.Height )
	
	-- шрифт для текста отсчета
	hint_button._font = sf.core.g_Application.GetResourceManager().GetFont(hint_button._font_id)
	
	-- смещение текста
	hint_button._text_offset = hint_button._text_offset
					 
	-- запоминаем виджеты
	hint_button._hint_button_widget = button_widget
	hint_button._hint_resume_widget = resume_widget
	
	hint_button.SetHintButtonDisabled(false)
	hint_button._show_hint_timer_mode = false
	hint_button._text = nil
end	

-- обновляем размер изображеняи прогресса
function hint_button.UpdateProgressImage(_koef)
    hint_button._image.SetRect(sf.misc.FloatRect(0, 
												 0, 
												 hint_button._parent_size.X * _koef, 
												 hint_button._parent_size.Y) )
    hint_button._image.SetSourceRect(sf.misc.FloatRect(0, 
													   0, 
													   hint_button._image_size.X * _koef, 
													   hint_button._image_size.Y) )
end

-- отрисовываем если нужно прогрессбар или текст
function hint_button.DoDraw(_this, _renderer)
    if hint_button._show then
		if hint_button._text and hint_button._font then
			_renderer.RenderString(hint_button._font, 
			                       hint_button._text, 
								   hint_button._text_offset.X, 
								   hint_button._text_offset.Y, 
								   0, 
								   0, 
								   1, 
								   sf.graphics.Color(255, 255, 255, 255), 0)
		else
			_renderer.PushState()
			_renderer.ApplyMatrix( sf.misc.MatrixTranslation(hint_button._image_offset.X, hint_button._image_offset.Y))
			hint_button._image.Draw(_renderer) 
			_renderer.PopState()
		end
	end
    return false
end
