local _G = _G
local select = _G.select
local tonumber = _G.tonumber

local LIS = LibStub("LibItemSpec-2.0")

local itemLinkType = "item:(%d+):(%d+):(%d+):(%d+):(%d+):(%d+):(%d+)"
local itemLinkType2 = "item:%d:%d:%d:%d:%d:%d:%d:%d:%d"
local simpleLink = "\124H(.+)\124h%["
local fullItemLink = "\124cff%s\124H%s\124h[%s]\124h\124r"
local text, ugc

function InvenSimulatorUI:SetGemAndEnchant(link, newEnchant, newGem1, newGem2, newGem3, newGem4, newSuffix)
	if type(link) == "string" and link:find("item:") then
		local color, itemString, itemName = link:match("^\124cff(%x+)\124H(.+)\124h%[(.+)%]")
		local itemID, enchant, gem1, gem2, gem3, gem4, suffix, unique = itemString:match(itemLinkType)
		itemID = tonumber(itemID) or 0
		enchant = newEnchant or tonumber(enchant) or 0
		gem1 = newGem1 or tonumber(gem1) or 0
		gem2 = newGem2 or tonumber(gem2) or 0
		gem3 = newGem3 or tonumber(gem3) or 0
		gem4 = newGem4 or tonumber(gem4) or 0
		suffix = newSuffix or tonumber(suffix) or 0
		link = fullItemLink:format(color, itemLinkType2:format(itemID, enchant, gem1, gem2, gem3, gem4, suffix, 0, 80), itemName)
	end
	return link
end

function InvenSimulatorUI:GetGemID(link)
	if type(link) == "string" and link:find("item:") then
		local gem1, gem2, gem3, gem4 = select(3, link:match(itemLinkType))
		return tonumber(gem1) or 0, tonumber(gem2) or 0, tonumber(gem3) or 0, tonumber(gem4) or 0
	end
	return 0, 0, 0, 0
end

function InvenSimulatorUI:GetEnchantID(link)
	if type(link) == "string" and link:find("item:") then
		return tonumber(select(2, link:match(itemLinkType)) or 0)
	end
	return 0
end

function InvenSimulatorUI:GetNumDragonEyeGem(link)
	if type(link) == "string" and link:find("item:") then
		local gem1, gem2, gem3, gem4 = select(3, link:match(itemLinkType))
		gem1, gem2, gem3, gem4 = tonumber(gem1) or 0, tonumber(gem2) or 0, tonumber(gem3) or 0, tonumber(gem4) or 0
		return (self.database.dragonEyeGem[gem1] and 1 or 0) + (self.database.dragonEyeGem[gem2] and 1 or 0) + (self.database.dragonEyeGem[gem3] and 1 or 0) + (self.database.dragonEyeGem[gem4] and 1 or 0)
	end
	return 0
end

function InvenSimulatorUI:RemoveDragonEyeGem(link)
	local gem1, gem2, gem3, gem4 = self:GetGemID(link)
	if gem1 then
		return self:SetGemAndEnchant(link, nil, self.database.dragonEyeGem[gem1] and 0 or gem1, self.database.dragonEyeGem[gem2] and 0 or gem2, self.database.dragonEyeGem[gem3] and 0 or gem3, self.database.dragonEyeGem[gem4] and 0 or gem4)
	else
		return link
	end
end

function InvenSimulatorUI:GetGemIDCount(gemID, skipSlot)
	if type(gemID) == "number" and gemID > 0 then
		local count, gem1, gem2, gem3, gem4 = 0
		for i = 1, 19 do
			if self.db.items[i] and i ~= skipSlot then
				gem1, gem2, gem3, gem4 = self:GetGemID(self.db.items[i])
				count = count + (gem1 == gemID and 1 or 0) + (gem2 == gemID and 1 or 0) + (gem3 == gemID and 1 or 0) + (gem4 == gemID and 1 or 0)
			end
		end
		return count
	end
	return 0
end

local tooltipLines = { GameTooltipTextLeft1 }
local socketText1, socketText2
local emptySocket = GameTooltip:CreateTexture("GameTooltip_ICC_Texture", "OVERLAY")
emptySocket:SetTexture("Interface\\ItemSocketingFrame\\UI-EmptySocket")
emptySocket:SetWidth(12)
emptySocket:SetHeight(12)
emptySocket:Hide()

function InvenSimulatorUI:EditTooltip(tooltip, slotID)
	if slotID == 6 or slotID == 9 or slotID == 10 then
		local gem1, gem2, gem3, gem4 = self:GetGemID(select(2, tooltip:GetItem()))
		if slotID == 6 and (gem1 == 3729 or gem2 == 3729 or gem3 == 3729 or gem4 == 3729) then
			socketText1, socketText2 = "|cffff2020허리띠 보석 홈|r", "|cffffffff허리띠 보석 홈|r"
		elseif slotID == 9 and (gem1 == 3717 or gem2 == 3717 or gem3 == 3717 or gem4 == 3717) then
			socketText1, socketText2 = "|cffff2020팔보호구 보석 홈|r", "팔보호구 보석 홈"
		elseif slotID == 10 and (gem1 == 3723 or gem2 == 3723 or gem3 == 3723 or gem4 == 3723) then
			socketText1, socketText2 = "|cffff2020장갑 보석 홈|r", "장갑 보석 홈"
		else
			socketText1, socketText2 = nil, nil
			emptySocket:Hide()
		end
	else
		socketText1, socketText2 = nil, nil
		emptySocket:Hide()
	end
	local bssocket = 0
	for i = 2, tooltip:NumLines() do
		tooltipLines[i] = tooltipLines[i] or _G["GameTooltipTextLeft"..i]
		text = tooltipLines[i]:GetText()
		if text then
			if text:find("^착용 효과:") or text:find("^사용 효과:") then
				break
			elseif text:find("^최소 요구 레벨") then
				tooltipLines[i]:SetTextColor(1, 1, 1)
				tooltipLines[i + 1] = tooltipLines[i + 1] or _G["GameTooltipTextLeft"..(i + 1)]
				if (tooltipLines[i + 1]:GetText() or ""):find("^요구 사항:") then
					tooltipLines[i + 1]:SetTextColor(1, 1, 1)
				end
				break
			elseif text:find("^요구 사항:") then
				tooltipLines[i]:SetTextColor(1, 1, 1)
				break
			elseif text:find("마법부여 유효 요구 레벨 (%d+)") then
				tooltipLines[i]:SetText(nil)
				tooltipLines[i]:SetTextColor(1, 1, 1)
				if tooltipLines[i - 1] then
					local r, g, b = tooltipLines[i - 1]:GetTextColor()
					if r > 0.9 and g < 0.2 and b < 0.2 then
						tooltipLines[i - 1]:SetTextColor(0, 1, 0)
					end
				end
			elseif text:find("마법부여 (.+) %((%d+)%)") then
				local tradeSkill, req = text:match("마법부여 (.+) %((%d+)%)")
				if self:HasTradeSkill(tradeSkill) then
					if tradeSkill == "대장기술" then
						tooltipLines[i]:SetText("보석 홈 대장기술 ("..req..")")
					elseif tradeSkill == "보석세공" then
						text = tooltipLines[i - 1]:GetText()
						text = text:gsub("cffff2020", "cffffffff")
						tooltipLines[i - 1]:SetText(text)
						tooltipLines[i - 1]:SetTextColor(1, 1, 1)
					else
						tooltipLines[i - 1]:SetTextColor(0, 1, 0)
					end
					tooltipLines[i]:SetTextColor(1, 1, 1)
				end
			elseif text == socketText1 or text == socketText2 then
				tooltipLines[i]:SetTextColor(0.5, 0.5, 0.5)
				tooltipLines[i]:SetText("    다색 보석 홈")
				emptySocket:ClearAllPoints()
				emptySocket:SetPoint("LEFT", tooltipLines[i], "LEFT")
				emptySocket:Show()
			elseif slotID == 1 and text:find("필요 조건:") then
				if self.gem:match("M(%d+)") == "1" then
					text = text:gsub("cff808080", "cffffffff")
				else
					text = text:gsub("cffffffff", "cff808080")
				end
				tooltipLines[i]:SetText(text)
			end
		else
			break
		end
	end

end

function InvenSimulatorUI:FixItemLink(link, slot)
	if self:HasTradeSkill(self:IsTradeSkillOnly(link)) then
		local itemType = select(9, GetItemInfo(link))
		local enchant = self:GetEnchantID(link)
		local gems = { self:GetGemID(link) }
		local gemNumSlots = (LIS:GetItemGemInfo(link) or ""):len()
		local deGemCount = self:GetNumDragonEyeGem(link)
		if deGemCount > 0 then
			if self:HasTradeSkill("보석세공") then
				-- 용의 눈 보석이 3개를 초과할 경우 초과분 제거
				for i = 1, 19 do
					if self.db.items[i] and i ~= slot then
						deGemCount = deGemCount + self:GetNumDragonEyeGem(self.db.items[i])
					end
				end
				if deGemCount > 3 then
					for i = 4, 1, -1 do
						if self.database.dragonEyeGem[gems[i]] then
							gems[i] = 0
							deGemCount = deGemCount - 1
							if deGemCount == 3 then
								break
							end
						end
					end
				end
			else
				-- 보세가 아닐경우 용의 눈 보석 제거하기
				for i = 1, 4 do
					gems[i] = self.database.dragonEyeGem[gems[i]] and 0 or gems[i]
				end
			end
		end
		-- 고유 장착 보석 처리
		for _, gemId in pairs(self.database.uniqueEquipGem) do
			ugc = (gems[1] == gemId and 1 or 0) + (gems[2] == gemId and 1 or 0) + (gems[3] == gemId and 1 or 0) + (gems[4] == gemId and 1 or 0)
			if ugc >= 1 then
				ugc = ugc + self:GetGemIDCount(gemId, slot)
				if ugc > 1 then
					for i = 4, 1, -1 do
						if gems[i] == gemId then
							gems[i] = 0
							ugc = ugc - 1
							if ugc == 1 then
								break
							end
						end
					end
				end
			end
		end
		if itemType == "INVTYPE_HEAD" then
			-- 기계공학이 아닐 경우 기공 마부 제거
			if not self:HasTradeSkill("기계공학") and enchant == 3878 then
				enchant = 0
			end
		elseif itemType == "INVTYPE_WRIST" then
			-- 대장기술 손목 소켓 뚫기
			if self:HasTradeSkill("대장기술") then
				if gems[gemNumSlots + 1] == 0 then
					gems[gemNumSlots + 1] = 3717
				end
			else
				gems[gemNumSlots + 1] = 0
			end
			-- 가죽세공 유무에 따라 마부 변경
			if self:HasTradeSkill("가죽세공") then
				if enchant == 3850 then
					enchant = 3757
				elseif enchant == 3845 then
					enchant = 3756
				elseif enchant == 2332 then
					enchant = 3758
				end
			elseif enchant == 3757 then
				enchant = 3850
			elseif enchant == 3756 then
				enchant = 3845
			elseif enchant == 3758 then
				enchant = 2332
			elseif enchant == 3763 or enchant == 3759 or enchant == 3760 or enchant == 3762 or enchant == 3761 then
				enchant = 0
			end
		elseif itemType == "INVTYPE_HAND" then
			-- 대장기술 장갑 소켓 뚫기
			if self:HasTradeSkill("대장기술") then
				if gems[gemNumSlots + 1] == 0 then
					gems[gemNumSlots + 1] = 3723
				end
			else
				gems[gemNumSlots + 1] = 0
			end
			-- 기계공학이 아니면 장갑 마부 지우기
			if not self:HasTradeSkill("기계공학") and (enchant == 3860 or enchant == 3604 or enchant == 3603) then
				enchant = 0
			end
		elseif itemType == "INVTYPE_WAIST" then
			-- 허리 소켓 없을 경우 뚫어 주기
			if gems[gemNumSlots + 1] == 0 then
				gems[gemNumSlots + 1] = 3729
			end
			-- 기계공학이 아니면 허리 마부 지우기
			if not self:HasTradeSkill("기계공학") then
				enchant = 0
			end
		elseif itemType == "INVTYPE_FINGER" then
			-- 마부가 아닐경우 반지 마부 제거
			if enchant ~= 0 and not self:HasTradeSkill("마법부여") then
				enchant = 0
			end
		elseif itemType == "INVTYPE_SHOULDER" and not self:HasTradeSkill("주문각인") then
			-- 주문각인이 아닐 경우 어깨 마부 제거
			if enchant == 3835 then
				enchant = 3808
			elseif enchant == 3837 then
				enchant = 3811
			elseif enchant == 3838 then
				enchant = 3810
			elseif enchant == 3836 then
				enchant = 3809
			end
		elseif itemType == "INVTYPE_CLOAK" then
			-- 재봉술이 아닐 경우 망토 마부 지우기
			if not self:HasTradeSkill("재봉술") and (enchant == 3730 or enchant == 3728 or enchant == 3722) then
				enchant = 0
			-- 기계공학이 아닐 경우 망토 마부 지우기
			elseif not self:HasTradeSkill("기계공학") and (enchant == 3605 or enchant == 3859) then
				enchant = 0
			end
		elseif itemType == "INVTYPE_FEET" then
			-- 기계공학 이 아닐 경우 기공 장화 마부 지우기
			if not self:HasTradeSkill("기계공학") and enchant == 3606 then
				enchant = 0
			end
		elseif itemType == "INVTYPE_TRINKET" then
			local itemName = GetItemInfo(link) or link:match("%[(.+)%]")
			if not self:HasTradeSkill("연금술") and (itemName:find("연금술사의 돌$") or itemName:find("연금술사 돌$")) then
				return nil
			elseif not self:HasTradeSkill("보석세공") and itemName:find("^조각상 %-") then
				return nil
			end
		elseif itemType == "INVTYPE_WEAPON" or itemType == "INVTYPE_WEAPONMAINHAND" or itemType == "INVTYPE_WEAPONOFFHAND" then
			-- 죽음의 기사가 아닐 경우 룬벼리기 제거
			if self.class ~= "죽음의 기사" and self.database.runeforging[enchant] then
				enchant = 0
			end
		elseif itemType == "INVTYPE_2HWEAPON" then
			-- 죽음의 기사가 아닐 경우 룬벼리기 제거
			if self.class ~= "죽음의 기사" and self.database.runeforging[enchant] then
				enchant = 0
			end
		end
		return self:SetGemAndEnchant(link, enchant, gems[1], gems[2], gems[3], gems[4])
	else
		return nil
	end
end
