local _G = _G
local GetSpellInfo = _G.GetSpellInfo
local GetItemIcon = _G.GetItemIcon
local LIS = LibStub("LibItemSpec-2.0")
local LDM = LibStub("LibDropMenu-2.0")
local relic = InvenSimulatorUI.database.relicBuff
local itemBuff = InvenSimulatorUI.database.itemBuff
local itemEnchant = InvenSimulatorUI.database.itemEnchantBuff
local battlemasterTrinket = InvenSimulatorUI.database.battlemasterTrinket
local maxStatUpTrinket = InvenSimulatorUI.database.maxStatUpTrinket
local itemID, slot, itemText, itemText2, itemLink, otherItemID, otherSlot, upStat1, upStat2, equipLoc, enchantID

local deathbringersWillText = {
	"힘 600만큼 증가",
	"민첩성 600만큼 증가",
	"치명타 및 주문 극대화 적중도 600만큼 증가",
	"가속도 600만큼 증가",
	"전투력 1200만큼 증가",
}

function InvenSimulatorUI:CheckItemBuffStatus()
	slot = self.name
	if slot and InvenSimulatorCharDB.items[slot] then
		itemText = nil
		itemLink = InvenSimulatorCharDB.items[slot]
		itemID = LIS:GetItemID(itemLink)
		equipLoc = select(9, GetItemInfo(itemID))
		enchantID = InvenSimulatorUI:GetEnchantID(itemLink)
		if slot == 18 and relic[itemID] and (relic[itemID][2] == nil or (relic[itemID][2] and InvenSimulatorCharDB.talents[relic[itemID][2]])) then
			-- 성물
			if itemID == 45145 then
				-- 신성한 방패 활성화시 작동
				if InvenSimulatorCharDB.buffs["신성한 방패"] then
					itemText = relic[itemID][1]
				else
					return nil
				end
			elseif itemID == 47668 then
				-- 곰: 회피 숙련도 +200, 표범: 민첩성 +200
				if InvenSimulatorUI:HasStance("광포한 곰 변신") then
					itemText = relic[itemID][1]
				elseif InvenSimulatorUI:HasStance("표범 변신") then
					itemText = "민첩성 200만큼 증가"
				else
					return nil
				end
			elseif itemID == 47661 then
				-- 복수, 타락의 문장 있을때만
				if InvenSimulatorUI:HasStance("복수의 문장") or InvenSimulatorUI:HasStance("타락의 문장") then
					itemText = relic[itemID][1]
				else
					return nil
				end
			else
				itemText = relic[itemID][1]
			end
		elseif slot == 13 or slot == 14 then
			-- 장신구
			itemText = itemBuff[itemID]
			if battlemasterTrinket[itemID] then
				-- 양쪽 장신구 모두 지휘관의 장신구 일 때 효과가 가장 높은 장신구만 표시
				otherSlot = slot == 13 and 14 or 13
				otherItemID = InvenSimulatorCharDB.items[otherSlot] and LIS:GetItemID(InvenSimulatorCharDB.items[otherSlot])
				if otherItemID and battlemasterTrinket[otherItemID] then
					itemText = tonumber(itemText:match("(%d+)") or "") or 0
					if itemText > 0 then
						itemText2 = tonumber((itemBuff[itemID] or "0"):match("(%d+)") or "") or 0
						if itemText > itemText2 then
							itemText = itemBuff[itemID]
						elseif slot == 13 and itemText == itemText2 then
							itemText = itemBuff[itemID]
						else
							return nil
						end
					else
						return nil
					end
				end
			elseif maxStatUpTrinket[itemID] then
				-- 위대함, 죽선 등 가장 높은 능력치 장신구 표시
				otherSlot = slot == 13 and 14 or 13
				otherItemID = InvenSimulatorCharDB.items[otherSlot] and LIS:GetItemID(InvenSimulatorCharDB.items[otherSlot]) or nil
				if otherItemID and maxStatUpTrinket[itemID] == maxStatUpTrinket[otherItemID] and trinket[otherItemID] then
					upStat1, upStat2 = tonumber(itemText:match("(%d+)만큼") or 0), tonumber(trinket[otherItemID]:match("(%d+)만큼") or 0)
					if upStat1 > 0 and upStat2 > 0 then
						if upStat1 == upStat2 then
							if slot == 14 then
								return nil
							end
						elseif upStat1 < upStat2 then
							return nil
						end
					end
				end
			elseif itemID == 50362 or itemID == 50363 then
				-- 죽음인도자의 의지
				local slotdb = InvenSimulatorCharDB.buffs[slot]
				if InvenSimulatorUI.class == "전사" then
					if slotdb == 1 or slotdb == 3 or slotdb == 4 then
						itemText = deathbringersWillText[slotdb]
					else
						InvenSimulatorCharDB.buffs[slot] = nil
						itemText = itemBuff[itemID]
					end
				elseif InvenSimulatorUI.class == "도적" then
					if slotdb == 2 or slotdb == 4 or slotdb == 5 then
						itemText = deathbringersWillText[slotdb]
					else
						InvenSimulatorCharDB.buffs[slot] = nil
						itemText = itemBuff[itemID]
					end
				elseif InvenSimulatorUI.class == "사냥꾼" then
					if slotdb == 2 or slotdb == 3 or slotdb == 5 then
						itemText = deathbringersWillText[slotdb]
					else
						InvenSimulatorCharDB.buffs[slot] = nil
						itemText = itemBuff[itemID]
					end
				elseif InvenSimulatorUI.class == "드루이드" then
					if slotdb == 1 or slotdb == 2 or slotdb == 4 then
						itemText = deathbringersWillText[slotdb]
					else
						InvenSimulatorCharDB.buffs[slot] = nil
						itemText = itemBuff[itemID]
					end
				elseif InvenSimulatorUI.class == "주술사" then
					if slotdb == 2 or slotdb == 4 or slotdb == 5 then
						itemText = deathbringersWillText[slotdb]
					else
						InvenSimulatorCharDB.buffs[slot] = nil
						itemText = itemBuff[itemID]
					end
				elseif InvenSimulatorUI.class == "성기사" then
					if slotdb == 1 or slotdb == 3 or slotdb == 4 then
						itemText = deathbringersWillText[slotdb]
					else
						InvenSimulatorCharDB.buffs[slot] = nil
						itemText = itemBuff[itemID]
					end
				elseif InvenSimulatorUI.class == "죽음의 기사" then
					if slotdb == 1 or slotdb == 3 or slotdb == 4 then
						itemText = deathbringersWillText[slotdb]
					else
						InvenSimulatorCharDB.buffs[slot] = nil
						itemText = itemBuff[itemID]
					end
				end
				if itemText then
					if itemID == 50363 then
						-- 상급
						itemText = itemText:gsub("600", "700")
						itemText = itemText:gsub("1200", "1400")
					else
						-- 일반
						itemText = itemText:gsub("700", "600")
						itemText = itemText:gsub("1400", "1200")
					end
				end
			end
		elseif itemBuff[itemID] then
			itemText = itemBuff[itemID]
		else
			return nil
		end
		if itemText then
			if itemText:find("방패") and not InvenSimulatorUI:HasShield() then
				return nil
			end
			if self.itemLink ~= itemLink or itemID == 50362 or itemID == 50363 then
				self.itemLink = itemLink
				self.itemName = InvenSimulatorUI:GetSlotItemName(slot)
				self.icon:SetTexture(GetItemIcon(itemLink))
				self.icon:SetDesaturated(not self.enable)
			end
			InvenSimulatorUI:UpdateClassBuffText(slot, itemText)
			return true
		end
	end
	return nil
end

function InvenSimulatorUI:CheckItemEnchantBuffStatus()
	slot = tonumber((self.name or ""):match("enchant(%d+)") or "")
	if slot and InvenSimulatorCharDB.items[slot] then
		enchantID = InvenSimulatorUI:GetEnchantID(InvenSimulatorCharDB.items[slot])
		if enchantID and itemEnchant[enchantID] then
			if itemEnchant[enchantID][1]:find("방패") and not InvenSimulatorUI:HasShield() then
				return nil
			end
			self.itemName = GetSpellInfo(itemEnchant[enchantID][2])
			self.icon:SetTexture(select(3, GetSpellInfo(itemEnchant[enchantID][3])))
			self.icon:SetDesaturated(not self.enable)
			InvenSimulatorUI:UpdateClassBuffText("enchant"..slot, itemEnchant[enchantID][1])
			return true
		end
	end
	return nil
end

local function deathbringersWillFunc(index, slot)
	LDM:CloseMenu(1)
	InvenSimulatorUI:UpdateClassBuffText(slot, deathbringersWillText[index])
	InvenSimulatorUI:SetEnableBuff(slot, index)
	InvenSimulatorUI:Calculate()
end
local GetSpellIcon = function(id)
	return select(3, GetSpellInfo(id)) or nil
end

local deathbringersWillMenu = { type = "group", args = {
	str = { name = "힘", desc = "타운카의 힘\n|cffffffff힘 600만큼 증가|r", icon = GetSpellIcon(71484), type = "execute", order = 1, arg1 = 1, func = deathbringersWillFunc },
	agi = { name = "민첩성", desc = "브리쿨의 기민함\n|cffffffff민첩성 600만큼 증가|r", icon = GetSpellIcon(71485), type = "execute", arg1 = 2, order = 2, func = deathbringersWillFunc },
	crit = { name = "치명타 적중도", desc = "무쇠 드워프의 조준력\n|cffffffff치명타 및 주문 극대화 적중도 600만큼 증가|r", icon = GetSpellIcon(71491), type = "execute", arg1 = 3, order = 3, func = deathbringersWillFunc },
	haste = { name = "가속도", desc = "브리쿨의 속도\n|cffffffff가속도 600만큼 증가|r", icon = GetSpellIcon(71492), type = "execute", arg1 = 4, order = 4, func = deathbringersWillFunc },
	ap = { name = "전투력", desc = "타운카의 힘\n|cffffffff전투력 1200만큼 증가|r", icon = GetSpellIcon(71486), type = "execute", arg1 = 5, order = 5, func = deathbringersWillFunc },
	arp = { name = "방어구 관통력", desc = "무쇠 드워프의 정밀함\n|cffffffff방어구 관통력 600만큼 증가|r", icon = GetSpellIcon(71487), arg1 = 6, type = "execute", order = 6, func = deathbringersWillFunc },
	none = { name = "효과 제거", desc = "죽음인도자의 의지 효과를 제거합니다.", type = "execute", order = 99, arg1 = nil, func = deathbringersWillFunc },
}}
LDM:RegisterMenu("InvenSimulatorDeathbringersWillMenu", deathbringersWillMenu)

local deathbringersWillShownStats = {
	["전사"] = { ["str"] = true, ["crit"] = true, ["haste"] = true },
	["도적"] = { ["agi"] = true, ["haste"] = true, ["ap"] = true },
	["사냥꾼"] = { ["agi"] = true, ["crit"] = true, ["ap"] = true },
	["드루이드"] = { ["str"] = true, ["agi"] = true, ["haste"] = true },
	["주술사"] = { ["agi"] = true, ["haste"] = true, ["ap"] = true },
	["성기사"] = { ["str"] = true, ["haste"] = true, ["crit"] = true },
	["죽음의 기사"] = { ["str"] = true, ["haste"] = true, ["crit"] = true },
}

function InvenSimulatorUI:OpenDeathbringersWillMenu(button)
	if LDM:IsOpen("InvenSimulatorDeathbringersWillMenu") or not deathbringersWillShownStats[self.class] then
		LDM:CloseMenu(1)
		return
	end
	local itemID = LIS:GetItemID(InvenSimulatorCharDB.items[button.name])
	for name, menu in pairs(deathbringersWillMenu.args) do
		if name == "none" or deathbringersWillShownStats[self.class][name] then
			menu.hidden = nil
			if itemID == 50363 then
				-- 상급
				menu.desc = menu.desc:gsub("600", "700")
				menu.desc = menu.desc:gsub("1200", "1400")
			else
				-- 일반
				menu.desc = menu.desc:gsub("700", "600")
				menu.desc = menu.desc:gsub("1400", "1200")
			end
		else
			menu.hidden = true
		end
		menu.arg2 = button.name
	end
	LDM:OpenMenu("InvenSimulatorDeathbringersWillMenu", "TOPLEFT", button, "TOPRIGHT", nil, nil, nil, true)
end