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')
local _G = _G
local tooltipScanner
local tooltipName = "SLE_ArtifactPowerTooltipScanner"
local EMPOWERING_SPELL_ID = 227907
local empoweringSpellName
local arcanePower
local AP_NAME = T.format("|cFFE6CC80%s|r", ARTIFACT_POWER)
local pcall = pcall

local apLineIndex
local function GetItemLinkArtifactPower(slotLink)
	if slotLink then
		tooltipScanner:ClearLines()
		local success = pcall(tooltipScanner.SetHyperlink, tooltipScanner, slotLink)
		if (not success) then
			return nil
		end

		local apFound
		if (_G[tooltipName.."TextLeft2"]:GetText() == AP_NAME) then
			apLineIndex = 4
			apFound = true
		elseif (_G[tooltipName.."TextLeft3"]:GetText() == AP_NAME) then --When using colorblind mode then line 2 becomes the rarity, pushing ap text down 1 line
			apLineIndex = 5
			apFound = true
		end

		if not (apFound) then
			return nil
		end

		local apValue
		if T.find(_G[tooltipName.."TextLeft"..apLineIndex]:GetText(), "(%d+)[,.%s](%d+)") then
			apValue = T.gsub(strmatch(_G[tooltipName.."TextLeft"..apLineIndex]:GetText(), "(%d+[,.%s]%d+)"), "[,.%s]", "")
			apValue = T.tonumber(apValue)
		elseif T.find(_G[tooltipName.."TextLeft"..apLineIndex]:GetText(), "%d+") then
			apValue = T.tonumber(strmatch(_G[tooltipName.."TextLeft"..apLineIndex]:GetText(), "%d+"))
		end
		if E.db.sle.bags.artifactPower.short then apValue = E:ShortValue(apValue) end
		
		return apValue
	else
		return nil
	end
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 = select(10, T.GetContainerItemInfo(bagID, slotID))
			local slotLink = T.GetContainerItemLink(bagID,slotID)
			if (ID and slotLink) then
				arcanePower = GetItemLinkArtifactPower(slotLink)
				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")
	empoweringSpellName = GetSpellInfo(EMPOWERING_SPELL_ID)

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