Quantcast
local E, L, V, P, G, _ = unpack(ElvUI);
local CFO = E:GetModule('CharacterFrameOptions')
local LSM = LibStub("LibSharedMedia-3.0")

local ilvlSlots = {
	"HeadSlot","NeckSlot","ShoulderSlot","BackSlot","ChestSlot","WristSlot","MainHandSlot","SecondaryHandSlot",
	"HandsSlot","WaistSlot","LegsSlot","FeetSlot","Finger0Slot","Finger1Slot","Trinket0Slot","Trinket1Slot"
}

function CFO:UpdateItemLevel()
	local frame = _G["CharacterFrame"]
	if not frame:IsShown() then return end
	local itemLink, slot, current, maximum, r, g, b
	for i = 1, #ilvlSlots do
		frame = _G[("Character%s"):format(ilvlSlots[i])]
		frame.ItemLevel:SetText()
		local avgItemLevel, avgEquipItemLevel, actualItemLevel
		avgItemLevel, avgEquipItemLevel = GetAverageItemLevel()
		itemlink = GetInventoryItemLink("player",GetInventorySlotInfo(ilvlSlots[i]))
		if itemlink then
			local levelAdjust={ -- 11th item:id field and level adjustment
				["0"]=0,["1"]=8,["373"]=4,["374"]=8,["375"]=4,["376"]=4,
				["377"]=4,["379"]=4,["380"]=4,["445"]=0,["446"]=4,["447"]=8,
				["451"]=0,["452"]=8,["453"]=0,["454"]=4,["455"]=8,["456"]=0,
				["457"]=8,["458"]=0,["459"]=4,["460"]=8,["461"]=12,["462"]=16}
			local baseLevel = select(4,GetItemInfo(itemlink))
			local upgrade = itemlink:match(":(%d+)\124h%[")
			if baseLevel and upgrade and levelAdjust[upgrade] ~= nil then
				actualItemLevel = baseLevel + levelAdjust[upgrade]
			else
				actualItemLevel = baseLevel
			end
			if actualItemLevel <= avgEquipItemLevel - 10 then
				frame.ItemLevel:SetFormattedText("|cffff0000%i|r", actualItemLevel)
			elseif actualItemLevel >= avgEquipItemLevel + 10 then
				frame.ItemLevel:SetFormattedText("|cff00ff00%i|r", actualItemLevel)
			else
				frame.ItemLevel:SetFormattedText("|cffffff99%i|r", actualItemLevel)
			end
		end
		if not E.db.sle.characterframeoptions.itemlevel.enable then
			frame.ItemLevel:Hide()
		else
			frame.ItemLevel:Show()
		end
	end
end

function CFO:UpdateItemLevelFont()
	local frame
	for i = 1, #ilvlSlots do
		frame = _G[("Character%s"):format(ilvlSlots[i])]
		frame.ItemLevel:FontTemplate(LSM:Fetch("font", E.db.sle.characterframeoptions.itemlevel.font), E.db.sle.characterframeoptions.itemlevel.fontSize, E.db.sle.characterframeoptions.itemlevel.fontOutline)
	end
end

function CFO:LoadItemLevel()
	_G["CharacterFrame"]:HookScript("OnShow", function(self)
		CFO:UpdateItemLevel()
	end)

	self:RegisterEvent("PLAYER_EQUIPMENT_CHANGED", "UpdateItemLevel")
	self:RegisterEvent("SOCKET_INFO_UPDATE", "UpdateItemLevel")

	local frame
	for i = 1, #ilvlSlots do
		frame = _G[("Character%s"):format(ilvlSlots[i])]
		frame.ItemLevel = frame:CreateFontString(nil, "OVERLAY")
		frame.ItemLevel:SetPoint("TOP", frame, "TOP", 2, -3)
		frame.ItemLevel:FontTemplate(LSM:Fetch("font", E.db.sle.characterframeoptions.itemlevel.font), E.db.sle.characterframeoptions.itemlevel.fontSize, E.db.sle.characterframeoptions.itemlevel.fontOutline)
	end
end