local IRF2 = InvenRaidFrames2
local Option = IRF2.optionFrame
Option:SetScript("OnEvent", function(self, event, ...) self[event](self, ...) end)
Option:RegisterEvent("ADDON_LOADED")
Option:SetScript("OnShow", nil)

local _G = _G
local type = _G.type
local pairs = _G.pairs
local ipairs = _G.ipairs
local sort = _G.table.sort
local twipe = _G.table.wipe
local tinsert = _G.table.insert
local tremove = _G.table.remove
local CreateFrame = _G.CreateFrame
local LBO = LibStub("LibBlueOption-1.0")

local tabList = { "기본", "외형", "기능" }
local menuOnClick = function(id) Option:ShowDetailMenu(id) end
local menuList = {
	["기본"] = {
		{ name = "사용", desc = "애드온의 사용에 대한 설정을 합니다.", func = menuOnClick, create = "Use" },
		{ name = "정렬 및 배치", desc = "공격대 그룹의 정렬과 배치에 관한 설정을 합니다.", func = menuOnClick, create = "Group" },
		{ name = "소환수", desc = "소환수 모듈에 관한 설정을 합니다.", func = menuOnClick, create = "Pet" },
		{ name = "클릭 캐스팅", desc = "각 공격대원 프레임을 마우스 버튼과 Alt, Shift, Ctrl의 기능키 조합으로 주문을 시전할 클릭 캐스팅 설정을 합니다.", func = menuOnClick, create = "ClickCasting", disableScroll = true },
		{ name = "프로필 관리", desc = "캐릭터 별로 자신이 설정한 프로필로 간단히 변경 가능하게 해줍니다.", func = menuOnClick, create = "Profile", disableScroll = true },
	},
	["외형"] = {
		{ name = "프레임", desc = "각 공격대원 프레임의 외형을 설정합니다.", func = menuOnClick, create = "Frame" },
		{ name = "체력바", desc = "각 공격대원 프레임의 체력바 외형을 설정합니다.", func = menuOnClick, create = "HealthBar" },
		{ name = "마나바", desc = "각 공격대원 프레임의 마나바 외형을 설정합니다.", func = menuOnClick, create = "ManaBar" },
		{ name = "이름", desc = "각 공격대원 프레임의 이름 글자의 모양 및 스타일을 설정합니다.", func = menuOnClick, create = "Name" },
		{ name = "직업 색상", desc = "각 공격대원 프레임 상에 보여질 직업별 색상을 설정합니다.", func = menuOnClick, create = "ClassColor" },
		{ name = "파티 이름표", desc = "공격대 각 파티의 이름표 표시 및 색상에 관한 설정을 합니다. 파티 이름표는 파티별 정렬 방식에서만 사용할 수 있습니다.", func = menuOnClick, create = "PartyTag" },
		{ name = "배경 테두리", desc = "공격대 프레임 전체를 둘러싸는 테두리를 설정합니다.", func = menuOnClick, create = "Border" },
		{ name = "디버프 색상", desc = "디버프의 색상을 설정합니다.", func = menuOnClick, create = "DebuffColor" },
		{ name = "표시 우선 순위", desc = "프레임의 각 개체의 표시 우선 순위를 설정합니다. 위쪽에 있을 수록 상위에 표시됩니다. 예를 들어 버프 확인, 이름, 디버프 아이콘 순으로 우선 순위를 설정하면 디버프 위에 이름이 표시되고 이름 위에 버프 확인 아이콘이 표시됩니다.", func = menuOnClick, create = "Layer" },
	},
	["기능"] = {
		{ name = "어그로", desc = "위협 수준(어그로)을 획득한 플레이어의 이름 왼쪽에 붉은 색 화살표를 표시하거나 자신의 어그로 획득 유무에 따른 소리를 재생합니다.", func = menuOnClick, create = "Aggro" },
		{ name = "외곽선", desc = "각 공격대원 프레임의 주위에 있는 외곽선의 기능을 설정합니다.", func = menuOnClick, create = "Outline" },
		{ name = "사정 거리", desc = "사정 거리에 따른 프레임의 투명도를 설정합니다. 사제, 드루이드, 주술사, 성기사, 마법사, 흑마법사는 40m를 기준으로 하며 전사, 도적, 사냥꾼, 죽음의 기사는 28m를 기준으로 투명도가 적용됩니다.", func = menuOnClick, create = "Range" },
		{ name = "손실 생명력", desc = "손실 생명력을 각 공격대원 이름과 함께 표시할 방법을 설정합니다.", func = menuOnClick, create = "LostHealth" },
		{ name = "버프 확인", desc = "자신이 시전 할 수 있는 버프의 유무에 대해 설정합니다.", func = menuOnClick, create = "BuffCheck" },
		{ name = "주문 타이머", desc = "자신 및 타인이 시전한 이로운 주문의 지속 시간을 표시할 방법에 대해 설정합니다.", func = menuOnClick, create = "SpellTimer" },
		{ name = "사용자 주문 타이머", desc = "자신이 설정한 버프 및 디버프를 아이콘과 남은 시간으로 표시합니다. 버프/디버프 이름 입력후 꼭 앤터키를 눌러야 변경 사항이 적용됩니다.", func = menuOnClick, create = "UserSpellTimer" },
		{ name = "생존기 표시", desc = "플레이어가 시전한 생존기의 주문 이름을 플레이어의 이름과 대체합니다.", func = menuOnClick, create = "SurvivalSkill" },
		{ name = "들어오는 치유", desc = "플레이어에게 들어오는 치유량을 투명한 체력바로 보여주거나 아이콘으로 보여줍니다.", func = menuOnClick, create = "IncommingHeal" },
		{ name = "무시할 디버프 설정", desc = "표시 하지 않을 디버프를 추가 하거나 삭제합니다.", func = menuOnClick, create = "IgnoreDebuff" },
		{ name = "디버프 아이콘 표시", desc = "플레이어에게 걸려진 디버프를 프레임에 표시합니다.", func = menuOnClick, create = "DebuffIcon" },
		{ name = "디버프 체력바 표시", desc = "디버프의 종류에 따라 체력바 색상을 변경합니다.", func = menuOnClick, create = "DebuffHealth" },
		{ name = "디버프 소리 재생", desc = "해제 가능한 디버프가 걸린 플레이어가 있을 때 소리를 재생합니다.", func = menuOnClick, create = "DebuffSound" },
		{ name = "중요 디버프 표시", desc = "중요한 디버프를 프레임에 크게 표시합니다.", func = menuOnClick, create = "RaidDebuff" },
		{ name = "적대적인 대상 표시", desc = "정신 지배 등으로 적대적이된 플레이어의 체력바 색상을 변경합니다.", func = menuOnClick, create = "Enemy" },
		{ name = "전술 목표 아이콘", desc = "전술 목표 아이콘을 표시할 방법을 설정합니다.", func = menuOnClick, create = "RaidTarget" },
		{ name = "시전바", desc = "플레이어의 시전 바를 표시합니다.", func = menuOnClick, create = "CastingBar" },
		{ name = "부활 시전바", desc = "부활을 받고 있는 플레이어에게 부활 시전 바를 표시합니다. 제일 먼저 시전 완료될 시전바만 표시하며, 부활 시전에 관한 라이브러리 애드온을 사용하지 않는 플레이어는 시전바가 표시되지 않을 수 있습니다.", func = menuOnClick, create = "Resurrection" },
	},
}

function Option:ADDON_LOADED()
	self:UnregisterEvent("ADDON_LOADED")
	self.dropdownTable = {
		["가로세로"] = { "가로", "세로" },
		["위치1"] = { "좌측 상단", "좌측 하단", "우측 상단", "우측 하단" },
		["위치2"] = { "좌측 상단", "좌측", "좌측 하단", "상단", "중앙", "하단", "우측 상단", "우측", "우측 하단" },
		["직업"] = { "전사", "드루이드", "성기사", "죽음의 기사", "사제", "주술사", "도적", "마법사", "흑마법사", "사냥꾼" },
		["디버프"] = { "저주", "마법", "질병", "독", "무속성" },
		["디버프영문"] = { "Curse", "Magic", "Disease", "Poison", "Normal" },
		["사용자주문타이머"] = { "자신이 시전한 버프", "버프", "디버프", "사용 안함" },
		["징표"] = {},
	}
	for i = 1, 8 do
		self.dropdownTable["징표"][i] = ("|TInterface\\TargetingFrame\\UI-RaidTargetingIcon_%d:0:0:0:-1|t %s 징표"):format(i, _G["RAID_TARGET_"..i])
	end
	self.title = self:CreateFontString(nil, "OVERLAY", "GameFontNormalLarge")
	self.title:SetPoint("TOPLEFT", self, "TOPLEFT", 8, -12)
	self.title:SetText(self.name)
	self.version = self:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
	self.version:SetPoint("LEFT", self.title, "RIGHT", 2, 0)
	self.version:SetText("v"..IRF2.version)
	self.mainBorder = CreateFrame("Frame", nil, self)
	self.mainBorder:SetBackdrop({
		edgeFile = "Interface\\AddOns\\InvenRaidFrames2_Option\\Texture\\TooltipBorderNoneTop.tga",
		tile = true, edgeSize = 16,
		insets = { left = 5, right = 5, top = 5, bottom = 5 },
	})
	self.mainBorder:SetPoint("TOPLEFT", self.title, "BOTTOMLEFT", 1, -26)
	self.mainBorder:SetPoint("BOTTOMRIGHT", self, "BOTTOMLEFT", 163, 10)
	self.mainTab, self.mainScroll, self.detailScroll = {}, {}, {}
	local function tabOnClick(self)
		PlaySound("igCharacterInfoTab")
		Option:SetMainTab(self:GetID())
	end
	local function menuCheck(menu)
		for p, v in pairs(menu) do
			if v.create and type(Option["Create"..v.create.."Menu"]) ~= "function" then
				tremove(menu, p)
				menuCheck(menu)
				break
			end
		end
	end
	for i, name in ipairs(tabList) do
		self.mainTab[i] = CreateFrame("Button", Option:GetName().."Tab"..i, self, "OptionsFrameTabButtonTemplate")
		self.mainTab[i]:SetPoint("LEFT", self.mainTab[i - 1], "RIGHT", -16, 0)
		self.mainTab[i]:SetID(i)
		self.mainTab[i]:SetText(name)
		self.mainTab[i]:SetScript("OnClick", tabOnClick)
		self.detailScroll[name] = {}
		if menuList[name] then
			menuCheck(menuList[name])
		end
		PanelTemplates_TabResize(self.mainTab[i], 0)
	end
	self.mainTab[1]:ClearAllPoints()
	self.mainTab[1]:SetPoint("TOPLEFT", self.title, "BOTTOMLEFT", 2, -3)
	self.mainTabLine1 = self.mainBorder:CreateTexture(nil, "OVERLAY")
	self.mainTabLine1:SetTexture("Interface\\OptionsFrame\\UI-OptionsFrame-Spacer")
	self.mainTabLine1:SetHeight(16)
	self.mainTabLine2 = self.mainBorder:CreateTexture(nil, "OVERLAY")
	self.mainTabLine2:SetTexture("Interface\\OptionsFrame\\UI-OptionsFrame-Spacer")
	self.mainTabLine2:SetHeight(16)
	self.detailBorder = CreateFrame("Frame", nil, self)
	self.detailBorder:SetBackdrop({
		edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
		tile = true, edgeSize = 16,
		insets = { left = 5, right = 5, top = 5, bottom = 5 },
	})
	self.detailBorder:SetBackdropBorderColor(0.6, 0.6, 0.6, 1)
	self.detailBorder:SetPoint("TOPLEFT", self.mainBorder, "TOPRIGHT", 4, 0)
	self.detailBorder:SetPoint("BOTTOMRIGHT", self, "BOTTOMRIGHT", -10, 10)
	self.detailDesc = self:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall")
	self.detailDesc:SetHeight(36)
	self.detailDesc:SetJustifyH("LEFT")
	self.detailDesc:SetJustifyV("BOTTOM")
	self.detailDesc:SetNonSpaceWrap(true)
	self.detailDesc:SetPoint("BOTTOMLEFT", self.detailBorder, "TOPLEFT", 12, 4)
	self.detailDesc:SetPoint("RIGHT", -18, 0)
	PanelTemplates_SetNumTabs(self, #tabList)
	self:SetMainTab(1)
end

function Option:SetMainTab(id)
	self.openedTabName = tabList[id]
	PanelTemplates_Tab_OnClick(self.mainTab[id], self)
	PanelTemplates_UpdateTabs(self)
	self.mainTabLine1:ClearAllPoints()
	self.mainTabLine1:SetPoint("LEFT", self.mainBorder, "TOPLEFT", 8, 0)
	self.mainTabLine1:SetPoint("RIGHT", self.mainTab[id], "BOTTOMLEFT", 10, 1)
	self.mainTabLine2:ClearAllPoints()
	self.mainTabLine2:SetPoint("LEFT", self.mainTab[id], "BOTTOMRIGHT", -10, 1)
	self.mainTabLine2:SetPoint("RIGHT", self.mainBorder, "RIGHT", -8, 0)
	id = self.mainTab[id].name
	if not self.mainScroll[self.openedTabName] and type(menuList[self.openedTabName]) == "table" and #menuList[self.openedTabName] > 0 then
		self.mainScroll[self.openedTabName] = LBO:CreateWidget("Menu", self, menuList[self.openedTabName])
		self.mainScroll[self.openedTabName]:SetAllPoints(self.mainBorder)
		self.mainScroll[self.openedTabName]:SetBackdrop(nil)
		self.mainScroll[self.openedTabName]:SetValue(1)
	end
	for name, frame in pairs(self.mainScroll) do
		if name == self.openedTabName then
			frame:Show()
		else
			frame:Hide()
		end
	end
	self:ShowDetailMenu(self.mainScroll[self.openedTabName]:GetValue())
end

function Option:ShowDetailMenu(id)
	self.openedDetailName = menuList[self.openedTabName][id].name
	if not self.detailScroll[self.openedTabName][self.openedDetailName] then
		local menu
		if menuList[self.openedTabName][id].create and not menuList[self.openedTabName][id].disableScroll then
			menu = LBO:CreateWidget("ScrollFrame", self.mainScroll[self.openedTabName])
		else
			menu = CreateFrame("Frame", nil, self.mainScroll[self.openedTabName])
		end
		menu:Hide()
		menu.options = {}
		menu:SetPoint("TOPLEFT", self.detailBorder, "TOPLEFT", 5, -5)
		menu:SetPoint("BOTTOMRIGHT", self.detailBorder, "BOTTOMRIGHT", -5, 5)
		if menuList[self.openedTabName][id].create then
			self["Create"..menuList[self.openedTabName][id].create.."Menu"](self, menu.options, menu.content or menu)
		end
		self.detailScroll[self.openedTabName][self.openedDetailName] = menu
	end
	for name, frame in pairs(self.detailScroll[self.openedTabName]) do
		if name == self.openedDetailName then
			frame:Show()
		else
			frame:Hide()
		end
	end
	self.detailDesc:SetText(menuList[self.openedTabName][id].desc or "")
end

function Option:ConvertTable(input, output)
	if type(input) == "table" then
		if type(output) == "table" then
			twipe(output)
		else
			output = {}
		end
		for p, v in pairs(input) do
			if v then
				tinsert(output, p)
			end
		end
		sort(output)
		return output
	else
		return nil
	end
end