local _G = _G
local pairs = _G.pairs
local type = _G.type
local tinsert = _G.table.insert
local GetItemIcon = _G.GetItemIcon

local LDM = LibStub("LibDropMenu-2.0")

local doping = {
	["영약"] = {
		["47499_STR"] = "극지의 영약 (힘)",
		["47499_AP"] = "극지의 영약 (전투력)",
		["47499_SP"] = "극지의 영약 (주문력)",
		[33208] = "오색 신비의 영약",
		[13511] = "순수한 지혜의 영약",
		[46377] = "끝없는 분노의 영약",
		[22851] = "증강의 영약",
		[46378] = "순수한 모조의 영약",
		[46379] = "완전한 피의 영약",
		[46376] = "서리 고룡의 영약",
	},
	["전투 비약"] = {
		[28103] = "숙련의 비약",
		[44325] = "적중의 비약",
		[44330] = "방어구 관통의 비약",
		[44327] = "치명적인 일격의 비약",
		[44329] = "숙련 향상의 비약",
		[22825] = "치유력 강화의 비약",
		[44331] = "광속의 비약",
		[22831] = "최상급 민첩의 비약",
		[39666] = "강력한 민첩의 비약",
		[40073] = "강력한 힘의 비약",
		[40076] = "숙달의 비약",
		[40070] = "주문 강화의 비약",
		[40068] = "격노의 비약",
	},
	["강화 비약"] = {
		[32067] = "드레나이 지혜의 비약",
		[22848] = "권능의 비약",
		[32068] = "무쇠가죽 비약",
		[44328] = "강력한 방어의 비약",
		[40078] = "강력한 인내의 비약",
		[40109] = "강력한 마법사의 피 비약",
		[44332] = "강력한 사고의 비약",
		[40097] = "보호의 비약",
		[40072] = "정신력의 비약",
	},
	["음식"] = {
		[42999] = "용지느러미 장작구이",
		[42995] = "영양가 높은 코뿔소 고기",
		[34766] = "삶은 북해 독중개",
		[34756] = "매콤한 벌레 햄버거",
		[42994] = "맛있는 벌레 스테이크",
		[43015] = "생선 통구이",
		[34757] = "탄 검은늑대 고기",
		[44953] = "검은늑대 육회",
		[42993] = "매콤한 청어 튀김",
		[34755] = "부드러운 뽀족엄니 스테이크",
		[42998] = "오징어 스테이크",
		[43000] = "용지느러미 살코기 요리",
	},
	["물약"] = {
		[22837] = "영웅의 물약",
		[40093] = "파괴 불가능의 물약",
		[40211] = "속도의 물약",
		[40212] = "마법 폭주의 물약",
		[22828] = "광기어린 힘의 물약",
	},
}
local dopingText = {
	-- 영약
	["47499_STR"] = "힘 40만큼 증가",
	["47499_AP"] = "전투력 80만큼 증가",
	["47499_SP"] = "주문력 47만큼 증가",
	[33208] = { "모든 능력치 18만큼 증가\n모든 저항력 35만큼 증가", "모든 능력치 22만큼 증가\n모든 저항력 39만큼 증가" },
	[13511] = { "지능 65만큼 증가", "지능 85만큼 증가" },
	[46377] = { "전투력 180만큼 증가", "전투력 260만큼 증가" },
	[22851] = { "최대 생명력 500만큼 증가\n방어 숙련도 10만큼 증가", "최대 생명력 721만큼 증가\n방어 숙련도 15만큼 증가" },
	[46378] = { "5초당 마나 회복량 45만큼 증가", "5초당 마나 회복량 65만큼 증가" },
	[46379] = { "최대 생명력 1300만큼 증가", "최대 생명력 1950만큼 증가" },
	[46376] = { "주문력 125만큼 증가", "주문력 172만큼 증가" },
	-- 전투 비약
	[28103] = { "주문력 24만큼 증가\n치명타 및 주문 극대화 적중도 24만큼 증가", "주문력 33만큼 증가\n치명타 및 주문 극대화 적중도 33만큼 증가" },
	[44325] = { "적중도 45만큼 증가", "적중도 61만큼 증가" },
	[44330] = { "방어구 관통력 45만큼 증가", "방어구 관통력 61만큼 증가" },
	[44327] = { "치명타 및 주문 극대화 적중도 45만큼 증가", "치명타 및 주문 극대화 적중도 61만큼 증가" },
	[44329] = { "숙련도 45만큼 증가", "숙련도 61만큼 증가" },
	[22825] = { "주문력 24만큼 증가\n정신력 24만큼 증가", "주문력 33만큼 증가\n정신력 33만큼 증가" },
	[44331] = { "가속도 45만큼 증가", "가속도 61만큼 증가" },
	[22831] = { "민첩성 30만큼 증가\n치명타 및 주문 극대화 적중도 12만큼 증가", "민첩성 40만큼 증가\n치명타 및 주문 극대화 적중도 16만큼 증가" },
	[39666] = { "민첩성 45만큼 증가", "민첩성 61만큼 증가" },
	[40073] = { "힘 50만큼 증가", "힘 66만큼 증가" },
	[40076] = { "모든 능력치 20만큼 증가", "모든 능력치 26만큼 증가" },
	[40070] = { "주문력 58만큼 증가", "주문력 77만큼 증가" },
	[40068] = { "전투력 90만큼 증가", "전투력 122만큼 증가" },
	-- 강화 비약
	[32067] = { "지능 30만큼 증가\n정신력 30만큼 증가", "지능 38만큼 증가\n정신력 38만큼 증가" },
	[22848] = { "주문 관통력 30만큼 증가", "주문 관통력 40만큼 증가" },
	[32068] = { "탄력도 30만큼 증가", "탄력도 40만큼 증가" },
	[44328] = { "방어 숙련도 45만큼 증가", "방어 숙련도 61만큼 증가" },
	[40078] = { "최대 생명력 350만큼 증가\n5초당 생명력 회복량 20만큼 증가", "최대 생명력 466만큼 증가\n5초당 생명력 회복량 26만큼 증가" },
	[40109] = { "5초당 마나 회복량 30만큼 증가", "5초당 마나 회복량 40만큼 증가" },
	[44332] = { "지능 45만큼 증가", "지능 61만큼 증가" },
	[40097] = { "방어도 800만큼 증가", "방어도 1024만큼 증가" },
	[40072] = { "정신력 50만큼 증가", "정신력 66만큼 증가" },
	-- 음식
	[42999] = "민첩성 40만큼 증가\n체력 40만큼 증가",
	[42995] = "방어구 관통력 40만큼 증가\n체력 40만큼 증가",
	[34766] = "전투력 80만큼 증가\n체력 40만큼 증가",
	[34756] = "치명타 및 주문 극대화 적중도 40만큼 증가\n체력 40만큼 증가",
	[42994] = "숙련도 40만큼 증가\n체력 40만큼 증가",
	[43015] = "전투력 80만큼 증가\n주문력 46만큼 증가\n체력 40만큼 증가",
	[34757] = "가속도 40만큼 증가\n체력 40만큼 증가",
	[44953] = "적중도 40만큼 증가\n체력 40만큼 증가",
	[42993] = "5초당 마나 회복량 16만큼 증가\n체력 40만큼 증가",
	[34755] = "주문력 46만큼 증가\n체력 40만큼 증가",
	[42998] = "정신력 40만큼 증가\n체력 40만큼 증가",
	[43000] = "힘 40만큼 증가\n체력 40만큼 증가",
	-- 물약
	[22837] = "힘 70만큼 증가\n최대 생명력 700만큼 증가",
	[40093] = "방어도 3500만큼 증가",
	[40211] = "가속도 500만큼 증가",
	[40212] = "주문력 200만큼 증가\n치명타 및 주문 극대화 적중도 200만큼 증가",
	[22828] = "힘 120만큼 증가\n방어 숙련도 75만큼 감소",
}

local baseIcon = {
	["전투 비약"] = "Interface\\Icons\\INV_Alchemy_Potion_02",
	["강화 비약"] = "Interface\\Icons\\INV_Alchemy_Potion_03",
	["음식"] = "Interface\\Icons\\Spell_Misc_Food",
	["물약"] = "Interface\\Icons\\INV_Alchemy_Elixir_Empty",
}

local flaskOfTheNorth = { ["47499_STR"] = 1, ["47499_AP"] = 2, ["47499_SP"] = 3 }

local dopingMenuSet = function(p, id)
	if p == "영약" then
		p = "전투 비약"
		InvenSimulatorCharDB.buffs["강화 비약"] = nil
	end
	if id and dopingText[id] then
		if type(dopingText[id]) == "table" then
			if InvenSimulatorUI:HasTradeSkill("연금술") then
				InvenSimulatorUI:UpdateClassBuffText(p, dopingText[id][2])
			else
				InvenSimulatorUI:UpdateClassBuffText(p, dopingText[id][1])
			end
		else
			InvenSimulatorUI:UpdateClassBuffText(p, dopingText[id])
		end
	else
		InvenSimulatorUI:UpdateClassBuffText(p, p.." 없음")
	end
	InvenSimulatorUI:SetEnableBuff(p, id)
	LDM:CloseMenu(1)
	InvenSimulatorUI:Calculate()
end

local flaskOfTheNorthHidden = function()
	return not InvenSimulatorUI:HasTradeSkill("연금술")
end

local dopingMenu = { type = "group",
	args = {
		["전투 비약"] = { type = "group", name = "전투 비약", order = 10, args = {} },
		["강화 비약"] = { type = "group", name = "강화 비약", order = 20, args = {} },
		["영약"] = { type = "group", name = "영약", order = 30, args = {} },
		["음식"] = { type = "group", name = "음식", order = 40, args = {} },
		["물약"] = { type = "group", name = "물약", order = 50, args = {} },
		none = { type = "execute", name = "없음", desc = "도핑을 제거합니다.", order = 100, func = dopingMenuSet },
	},
}

local hasAlchemy = nil
local order = {}

for p, list in pairs(doping) do
	for id in pairs(list) do
		tinsert(order, id)
	end
	sort(order, function(a, b)
		if flaskOfTheNorth[a] or flaskOfTheNorth[b] then
			if flaskOfTheNorth[a] and flaskOfTheNorth[b] then
				return flaskOfTheNorth[a] < flaskOfTheNorth[b]
			elseif flaskOfTheNorth[a] then
				return true
			else
				return false
			end
		else
			return list[a] < list[b]
		end
	end)
	for i, id in ipairs(order) do
		if flaskOfTheNorth[id] then
			-- 극지의 영약
			dopingMenu.args[p].args[i] = {
				type = "execute", name = list[id], icon = GetItemIcon(47499), desc = list[id],
				arg1 = p, arg2 = id, func = dopingMenuSet, order = i,
				desc1 = dopingText[id], hidden = flaskOfTheNorthHidden
			}
		else
			dopingMenu.args[p].args[i] = {
				type = "execute", name = list[id], icon = GetItemIcon(id), desc = list[id],
				arg1 = p, arg2 = id, func = dopingMenuSet, order = i,
				desc1 = type(dopingText[id]) == "table" and dopingText[id][1] or dopingText[id],
			}
		end
	end
	dopingMenu.args[p].args.none = { type = "execute", name = "없음", desc = "도핑을 제거합니다.", arg1 = p, arg2 = nil, order = 100, func = dopingMenuSet }
	for i in pairs(order) do
		order[i] = nil
	end
end

function InvenSimulatorUI:CheckDopingStatus()
	if hasAlchemy ~= InvenSimulatorUI:HasTradeSkill("연금술") then
		hasAlchemy = InvenSimulatorUI:HasTradeSkill("연금술")
		for _, t in pairs(dopingMenu.args) do
			if t.args then
				for _, v in pairs(t.args) do
					if v.arg2 and type(dopingText[v.arg2]) == "table" then
						if hasAlchemy then
							v.desc1 = dopingText[v.arg2][2]
							v.name = v.name.." (혼합술)"
						else
							v.desc1 = dopingText[v.arg2][1]
							v.name = v.name:gsub(" %(혼합술%)", "")
						end
					end
				end
			end
		end
	end
	if InvenSimulatorCharDB.buffs[self.name] and not dopingText[InvenSimulatorCharDB.buffs[self.name]] then
		InvenSimulatorCharDB.buffs[self.name] = nil
	end
	if InvenSimulatorCharDB.buffs[self.name] then
		if type(dopingText[InvenSimulatorCharDB.buffs[self.name]]) == "table" then
			if hasAlchemy then
				InvenSimulatorUI:UpdateClassBuffText(self.name, dopingText[InvenSimulatorCharDB.buffs[self.name]][2])
			else
				InvenSimulatorUI:UpdateClassBuffText(self.name, dopingText[InvenSimulatorCharDB.buffs[self.name]][1])
			end
		else
			InvenSimulatorUI:UpdateClassBuffText(self.name, dopingText[InvenSimulatorCharDB.buffs[self.name]])
		end
		if self.name == "전투 비약" then
			self.itemName = doping["영약"][InvenSimulatorCharDB.buffs[self.name]] or doping["전투 비약"][InvenSimulatorCharDB.buffs[self.name]]
		else
			self.itemName = doping[self.name][InvenSimulatorCharDB.buffs[self.name]]
		end
		if flaskOfTheNorth[InvenSimulatorCharDB.buffs[self.name]] then
			-- 극지의 영약 처리
			if hasAlchemy then
				self.itemName = "극지의 영약"
				self.icon:SetTexture(GetItemIcon(47499))
			else
				self.itemName = nil
				self.icon:SetTexture(baseIcon[self.name])
				self.icon:SetDesaturated(not self.enable)
				InvenSimulatorCharDB.buffs[self.name] = nil
				InvenSimulatorUI:UpdateClassBuffText(self.name, self.name.." 없음")
			end
		else
			if hasAlchemy and (self.name == "강화 비약" or self.name == "전투 비약") then
				self.itemName = self.itemName.." (혼합술)"
			end
			self.icon:SetTexture(GetItemIcon(InvenSimulatorCharDB.buffs[self.name]))
		end
	else
		self.itemName = nil
		InvenSimulatorUI:UpdateClassBuffText(self.name, self.name.." 없음")
		self.icon:SetTexture(baseIcon[self.name])
		self.icon:SetDesaturated(not self.enable)
	end
	if self.name == "강화 비약" and InvenSimulatorCharDB.buffs["전투 비약"] and doping["영약"][InvenSimulatorCharDB.buffs["전투 비약"]] then
		return nil
	end
	return true
end

function InvenSimulatorUI:OpenDopingMenu(button)
	if LDM:IsOpen("InvenSimulatorDopingMenu") then
		LDM:CloseMenu(1)
	else
		if button.name == "전투 비약" or button.name == "강화 비약" then
			for p in pairs(dopingMenu.args) do
				if p == "영약" or p == button.name then
					dopingMenu.args[p].hidden = nil
				elseif p == "none" then
					dopingMenu.args[p].arg1 = button.name
					dopingMenu.args[p].arg2 = nil
				else
					dopingMenu.args[p].hidden = true
				end
			end
			LDM:RegisterMenu("InvenSimulatorDopingMenu", dopingMenu)
		else
			dopingMenu.args[button.name].hidden = nil
			LDM:RegisterMenu("InvenSimulatorDopingMenu", dopingMenu.args[button.name])
		end
		LDM:OpenMenu("InvenSimulatorDopingMenu", "TOPLEFT", button, "TOPRIGHT", nil, nil, nil, true)
	end
end