Quantcast
local SLE, T, E, L, V, P, G = unpack(select(2, ...))
local AP = SLE:NewModule("ArtifactPowerBags", 'AceHook-3.0', 'AceEvent-3.0')
local B = E:GetModule('Bags')

--GLOBALS: CreateFrame, hooksecurefunc
local _G = _G
local tooltipScanner
local tooltipName = "SLE_ArtifactPowerTooltipScanner"
local arcanePower
local AP_NAME = format("%s|r", ARTIFACT_POWER)
local pcall = pcall
local GetItemSpell = GetItemSpell

-- local apLineIndex
local apItemCache = {}
local apStringValueMillion = {
	["enUS"] = "(%d*[%p%s]?%d+) million",
	["enGB"] = "(%d*[%p%s]?%d+) million",
	["ptBR"] = "(%d*[%p%s]?%d+) [[milhão][milhões]]?",
	["esMX"] = "(%d*[%p%s]?%d+) [[millón][millones]]?",
	["deDE"] = "(%d*[%p%s]?%d+) [[Million][Millionen]]?",
	["esES"] = "(%d*[%p%s]?%d+) [[millón][millones]]?",
	["frFR"] = "(%d*[%p%s]?%d+) [[million][millions]]?",
	["itIT"] = "(%d*[%p%s]?%d+) [[milione][milioni]]?",
	["ruRU"] = "(%d*[%p%s]?%d+) млн",
	["koKR"] = "(%d*[%p%s]?%d+)만",
	["zhTW"] = "(%d*[%p%s]?%d+)萬",
	["zhCN"] = "(%d*[%p%s]?%d+)万",
}
local apStringValueMillionLocal = apStringValueMillion[GetLocale()]
local function GetItemLinkArtifactPower(slotLink)
	local apValue
	if not slotLink then return nil end
	if IsArtifactPowerItem(slotLink) then
		tooltipScanner:ClearLines()
		local success = pcall(tooltipScanner.SetHyperlink, tooltipScanner, slotLink)
		if (not success) then
			return nil
		end

		local apFound
		for i = 3, 7 do
			local tooltipText = _G[tooltipName.."TextLeft"..i]:GetText()
			if (tooltipText and not T.match(tooltipText, AP_NAME)) then
				local digit1, digit2, digit3, ap
				local value = T.match(tooltipText, apStringValueMillionLocal)

				if value then
					digit1, digit2 = T.match(value, "(%d+)[%p%s](%d+)")
					if digit1 and digit2 then
						ap = T.tonumber(T.format("%s.%s", digit1, digit2)) * 1e6 --Multiply by one million
					else
						ap = T.tonumber(value) * 1e6 --Multiply by one million
					end
				else
					digit1, digit2, digit3 = T.match(tooltipText,"(%d+)[%p%s]?(%d+)[%p%s]?(%d+)")
					ap = T.tonumber(T.format("%s%s%s", digit1 or "", digit2 or "", (digit2 and digit3) and digit3 or ""))
				end

				if ap then
					apValue = ap
					apValue = T.tonumber(apValue)
					apFound = true
					break
				end
			end
		end

		if (not apFound) then
			apItemCache[slotLink] = false --Cache item as not granting AP
		end
	else
		apItemCache[slotLink] = false --Cache item as not granting AP
	end

	return apValue
end


local function SlotUpdate(self, bagID, slotID)
	if (not bagID or not slotID) or bagID == -3 then return end
	if not self.Bags[bagID] or not self.Bags[bagID][slotID] then
		return;
	end

	local frame = self.Bags[bagID][slotID]
	if (not frame.artifactpowerinfo) and E.db.sle.bags.artifactPower.enable then
		frame.artifactpowerinfo = frame:CreateFontString(nil, 'OVERLAY')
		frame.artifactpowerinfo:Point("BOTTOMLEFT", 2, 2)
	end

	if E.db.sle.bags.artifactPower.enable then
		frame.artifactpowerinfo:FontTemplate(E.LSM:Fetch("font", E.db.sle.bags.artifactPower.fonts.font), E.db.sle.bags.artifactPower.fonts.size, E.db.sle.bags.artifactPower.fonts.outline)
		frame.artifactpowerinfo:SetText("")
		local r,g,b = E.db.sle.bags.artifactPower.color.r, E.db.sle.bags.artifactPower.color.g, E.db.sle.bags.artifactPower.color.b
		frame.artifactpowerinfo:SetTextColor(r, g, b)

		if (frame.artifactpowerinfo) then
			local ID = T.select(10, T.GetContainerItemInfo(bagID, slotID))
			local slotLink = T.GetContainerItemLink(bagID,slotID)
			if (ID and slotLink) then
				local arcanePower
				if apItemCache[slotLink] then
					if apItemCache[slotLink] ~= false then
						arcanePower = apItemCache[slotLink]
					end
				else
					arcanePower = GetItemLinkArtifactPower(slotLink)
					apItemCache[slotLink] = arcanePower
				end
				if E.db.sle.bags.artifactPower.short and arcanePower then arcanePower = E:ShortValue(arcanePower) end
				frame.artifactpowerinfo:SetText(arcanePower)
			end
		end
	elseif not E.db.sle.bags.artifactPower.enable and frame.artifactpowerinfo then
		frame.artifactpowerinfo:SetText("")
	end
end

function AP:Initialize()
	if not SLE.initialized or not E.private.bags.enable then return end

	tooltipScanner = CreateFrame("GameTooltip", tooltipName, nil, "GameTooltipTemplate")
	tooltipScanner:SetOwner(E.UIParent, "ANCHOR_NONE")

	hooksecurefunc(B,"UpdateSlot", SlotUpdate)
	hooksecurefunc(_G["ElvUI_ContainerFrame"],"UpdateSlot", SlotUpdate)
	self:RegisterEvent("BANKFRAME_OPENED", function()
		AP:UnregisterEvent("BANKFRAME_OPENED")
		B:Layout()
	end)
end
SLE:RegisterModule(AP:GetName())