--[[ 
	Окно переигрывания.
	В нем находятся кнопки, обозначающие уровни и комиксы. Кнопки уровней и комиксов, до которых игрок не дошел, недоступны.
	При клике по кнопке комикса игрок смотрит соответствующий комикс. При клике по кнопке уровня текущая сохраненная игра 
	прерывается и игрок начинает играть с соответствующего уровня.
--]]
replay_window = replay_window or {}
replay_window.actions = replay_window.actions or {}

function replay_window.Show(_window)
    replay_window._parent_window = _window
    -- прячем окно под переигрыванием
    replay_window._parent_window.AddFlags(replay_window._parent_window.FlagHidden)

    replay_window._current_preview = nil
    
	local dialog = sf.gui.CWindow()
	dialog.Load(g_App.GetSettings().GetChild("GUI", false).GetChildByAttribute("window", "id", "replay_window", true),
		g_App.GetSettings().GetChild("GUITemplates", false))
	dialog.UpdateLayout()
    local parent_offset = _window.GetAbsPos(true)
	dialog.SetOffset((1024 - dialog.GetSize().X)/2 - parent_offset.X, (768 - dialog.GetSize().Y)/2 - parent_offset.Y)
	
	local current_profile = game.g_ProfileManager.Instance().GetCurrentProfile()
	
	-- определяем, какие уровни и комиксы доступны игроку
	-- и дизаблим/енаблим соответствующие кнопки
	local iter = dialog.GetWidgets()
	while not iter.IsEnd() do
        -- если виджет - кнопка, проверяем, вдруг она кнопка переигрывания уровня или комикса
		local button = __cast(iter.Get(), sf.gui.CButtonWidget)
		if button then
			local id = button.GetId().c_str()
			
			local level_id = string.match(id, "level_(.+)")
			if level_id then
				-- кнопка уровня
				button.DisableButton(not current_profile or not current_profile.IsLevelStepAvailable(level_id))
			end
			
			local comics_id = string.match(id, "comics_(.+)")
			if comics_id then
				-- кнопка комикса
				button.DisableButton(not current_profile or not current_profile.IsComicsStepAvailable(comics_id))
			end
		else
            -- если виджет не кнопка, проверяем, является ли он виджетом предпросмотра
            local widget = iter.Get()
            local preview_id = string.match(widget.GetId().c_str(), "preview_(.+)")
            if preview_id then
                -- виджет с превью главы, прячем его
                widget.AddFlags(widget.FlagHidden)
            end
		end
		iter.Next()
	end
	
    _window.AddChildWindow(dialog)
end

function replay_window.DoDraw(_this, _renderer)
end

function replay_window.DoUpdate(_this)
end

function replay_window.OnChar(_this, _char, _keyboard_state, _state, _broadcast)
	return _this.SuperOnChar(_char, _keyboard_state, _state, _broadcast)
end

function replay_window.OnKeyDown(_this, _key, _keyboard_state, _state, _broadcast)
	return _this.SuperOnKeyDown( _key, _keyboard_state, _state, _broadcast)
end

function replay_window.OnKeyUp(_this, _key, _keyboard_state, _state, _broadcast)
	return _this.SuperOnKeyUp( _key, _keyboard_state, _state, _broadcast)
end

function replay_window.OnMouseMove(_this, _pos, _state, _broadcast)
	return _this.SuperOnMouseMove( _pos, _state, _broadcast) 
end

function replay_window.OnMouseDown(_this, _pos, _button, _state, _broadcast)
	return _this.SuperOnMouseDown( _pos, _button, _state, _broadcast) 
end

function replay_window.OnMouseUp(_this, _pos, _button, _state, _broadcast)
	return _this.SuperOnMouseUp( _pos, _button, _state, _broadcast) 
end

function replay_window.OnDoubleClick(_this, _pos, _state, _broadcast)
	return _this.SuperOnDoubleClick( _pos, _state, _broadcast) 
end

function replay_window.OnMouseWheel(_this, _pos, _delta, _state, _broadcast)
	return _this.SuperOnMouseWheel( _pos, _delta, _state, _broadcast)
end

-- отображает виджет предпросмотра уровня или комикса
-- если перед этим отображался другой виджет, прячет его
-- _preview_widget может быть nil
function replay_window._ShowPreview(_preview_widget)    
    -- прячем старый
    if replay_window._current_preview then
        replay_window._current_preview.AddFlags(sf.gui.CWidget.FlagHidden)
    end
    
    -- отображаем новый
    replay_window._current_preview = _preview_widget
    
    if replay_window._current_preview then
        replay_window._current_preview.RemFlags(sf.gui.CWidget.FlagHidden)
    end
end

function replay_window.OnChildAction(_this, _action, _child)
	if not _child then return false end
	local child_id = _child.GetId().c_str()
	local handler = replay_window.actions[child_id]
	if handler then handler = handler[_action.c_str()] end
	if handler then 
		handler(_this, _child) 
		return
	end
	
    -- обрабатываем наведение на кнопку уровня или комикса
    if _action.c_str() == "overed" then
        -- находим виджет 
        local preview_id = "preview_"..child_id
        local preview_widget = _this.GetWidget(preview_id, true).get()
        
        if preview_widget then
            replay_window._ShowPreview(preview_widget)
        end
        
    -- обрабатываем сброс наведенного состояния кнопки
    elseif _action.c_str() == "lost_over" then
        -- прячем предпросмотр, если отображается предпросмотр кнопки, у которой сбросилось наведенное состояние
        if replay_window._current_preview 
        and tostring(replay_window._current_preview.GetId()) == "preview_"..child_id then
            replay_window._ShowPreview(nil)
        end
        
    -- обрабатываем нажатие на кнопку уровня или комикса
	elseif _action.c_str() == "pressed" then
		local level_id = string.match(child_id, "level_(.+)")
		if level_id then
			-- начинаем игру с шага уровня level_id
			-- определяем номкр уровня, т.к. уровень можно начать только по порядковому номеру
			local level_index = 0
			for i,o in ipairs(g_QuestStr) do
				if o.Type == "level" then
					level_index = level_index + 1
                    if tostring(o.Id) == level_id then
                        break
                    end
				end
			end
			__assert(level_index ~= 0)
            
			if dialog_window.RunCustomDialog(_this, "confirm_replay_level_dialog") == 1 then
                -- очищаем статистику ачивментов перед стартом
                local profile = game.g_ProfileManager.Instance().GetCurrentProfile()
                __assert(profile)
                local stats = profile.GetAchievementsStats()
                stats.HogTime = 0
                stats.HogObjectsFoundInSuccess = 0
                stats.GameTime = 0
                
                
				main_menu.RunGame(level_index)
			end
			return
		end
		
		local comics_id = string.match(child_id, "comics_(.+)")
		if comics_id then
			-- показываем шаг комикса comics_id
			local found = false
			for i,o in ipairs(g_QuestStr) do
				if o.Type == "comics" and tostring(o.Id) == comics_id then
					found = true
					main_menu.RunComics(_this, o.Id, o.Childs, o.Track[1] or "", true, true, true)
					break
				end
			end
			__assert(found)
			return
		end
	end
end
	
replay_window.actions.close = 
{
	pressed = function(_window) 
        replay_window._parent_window.RemFlags(replay_window._parent_window.FlagHidden)
		_window.AddFlags(_window.FlagDead)
	end
}
