--
-- c_tex_names.lua
--

---------------------------------------
-- Local variables for this file
---------------------------------------
local myShader
local bShowTextureUsage = false
local uiTextureIndex = 1
local m_SelectedTextureName = ""
local scx, scy = guiGetScreenSize ()
local usageInfoList = {}


---------------------------------------
-- Startup
---------------------------------------
addEventHandler( "onClientResourceStart", resourceRoot,
	function()

		-- Version check
		if getVersion ().sortable < "1.1.0" then
			--outputChatBox( "Resource is not compatible with this client." )
			return
		end

		-- Create shader
		
	end
)

textureListEnabled = false

addCommandHandler("enabletexturenames", function()
	if getElementData(localPlayer, "aclLogin") then 
		textureListEnabled = not textureListEnabled 

		if textureListEnabled then
			local tec
			myShader, tec = dxCreateShader ( "texture_names/tex_names.fx", 1, 0, false, "all" )

			if not myShader then
				outputChatBox( "Could not create shader. Please use debugscript 3" )
			else
				outputChatBox( "Using technique " .. tec )

				outputChatBox( "Utility to help find world texture names", 255, 255, 0 )
		
				outputChatBox( "Press num_8 to view list", 0, 255, 255 )
				outputChatBox( "Press num_7 and num_9 to step list", 0, 255, 255 )
				outputChatBox( "Press k to copy texture name to clipboard", 0, 255, 255 )
			end
		else 
			destroyElement(myShader)
		end
	end
end)

---------------------------------------
-- Draw visible texture list
---------------------------------------
addEventHandler( "onClientRender", root,
	function()
		if textureListEnabled then
			usageInfoList = engineGetVisibleTextureNames ()

			local iXStartPos = scx - 200;
			local iYStartPos = 0;
			local iXOffset = 0;
			local iYOffset = 0;

			if bShowTextureUsage then
				for key, textureName in ipairs(usageInfoList) do

					local bSelected = textureName == m_SelectedTextureName;
					local dwColor = bSelected and tocolor(255,220,128) or tocolor(224,224,224,204)

					if bSelected then
						dxDrawText( textureName, iXStartPos + iXOffset + 1, iYStartPos + iYOffset + 1, 0, 0, tocolor(0,0,0) )
					end
					dxDrawText( textureName, iXStartPos + iXOffset, iYStartPos + iYOffset, 0, 0, dwColor )

					iYOffset = iYOffset + 15
					if iYOffset > scy - 15 then
						iYOffset = 0;
						iXOffset = iXOffset - 200;
					end
				end
			end
		end
	end
)


---------------------------------------
-- Handle keyboard events from KeyAutoRepeat
---------------------------------------
addEventHandler("onClientKeyClick", resourceRoot,
	function(key)
		if textureListEnabled then
			if key == "num_7" then
				moveCurrentTextureCaret( -1 )
			elseif key == "num_9" then
				moveCurrentTextureCaret( 1 )
			elseif key == "num_8" then
				bShowTextureUsage = not bShowTextureUsage
			elseif key == "k" then
				if m_SelectedTextureName ~= "" then
					setClipboard( m_SelectedTextureName )
					outputChatBox( "'" .. tostring(m_SelectedTextureName) .. "' copied to clipboard" )
				end
			end
		end
	end
)


---------------------------------------
-- Change current texture
---------------------------------------
function moveCurrentTextureCaret( dir )

	if #usageInfoList == 0 then
		return
	end

	-- Validate selection in current texture list, or find closest match
	for key, textureName in ipairs(usageInfoList) do
		if m_SelectedTextureName <= textureName then
			uiTextureIndex = key
			break
		end
	end

	-- Move position in the list
	uiTextureIndex = uiTextureIndex + dir
	uiTextureIndex = ( ( uiTextureIndex - 1 ) % #usageInfoList ) + 1

	-- Change highlighted texture
	engineRemoveShaderFromWorldTexture ( myShader, m_SelectedTextureName )
	m_SelectedTextureName = usageInfoList [ uiTextureIndex ]
	engineApplyShaderToWorldTexture ( myShader, m_SelectedTextureName )

end
