local SLE, T, E, L, V, P, G = unpack(select(2, ...)) 
local UF = E:GetModule('UnitFrames');
local SUF = SLE:GetModule("UnitFrames")
local texPath = [[Interface\AddOns\ElvUI_SLE\media\textures\role\]]
local texPathE = [[Interface\AddOns\ElvUI\media\textures\]]
local CUSTOM = CUSTOM

local function configTable()
	if not SLE.initialized then return end
	local positionValues = {
		TOPLEFT = 'TOPLEFT',
		LEFT = 'LEFT',
		BOTTOMLEFT = 'BOTTOMLEFT',
		RIGHT = 'RIGHT',
		TOPRIGHT = 'TOPRIGHT',
		BOTTOMRIGHT = 'BOTTOMRIGHT',
		CENTER = 'CENTER',
		TOP = 'TOP',
		BOTTOM = 'BOTTOM',
	};
	
	local function CreateOfflineConfig(group)
		local config = {
			order = 5,
			type = "group",
			guiInline = true,
			name = L["Offline Indicator"],
			get = function(info) return E.db.sle.unitframes.unit[group].offline[ info[#info] ] end,
			set = function(info, value) E.db.sle.unitframes.unit[group].offline[ info[#info] ] = value; UF:CreateAndUpdateHeaderGroup(group) end,
			args = {
				enable = { order = 1, type = "toggle", name = L["Enable"] },
				size = { order = 2, type = 'range', name = L["Size"], min = 10, max = 120, step = 1 },
				xOffset = { order = 3, type = 'range', name = L["X-Offset"], min = -600, max = 600, step = 1 },
				yOffset = { order = 4, type = 'range', name = L["Y-Offset"], min = -600, max = 600, step = 1 },
				texture = {
					order = 5,
					type = "select",
					name = L["Texture"],
					values = {
						["ALERT"] = [[|TInterface\DialogFrame\UI-Dialog-Icon-AlertNew:14|t]],
						["ARTHAS"] =[[|TInterface\LFGFRAME\UI-LFR-PORTRAIT:14|t]],
						["SKULL"] = [[|TInterface\LootFrame\LootPanel-Icon:14|t]],
						["PASS"] = [[|TInterface\PaperDollInfoFrame\UI-GearManager-LeaveItem-Transparent:14|t]],
						["NOTREADY"] = [[|TInterface\RAIDFRAME\ReadyCheck-NotReady:14|t]],
						["CUSTOM"] = CUSTOM,
					},
				},
				CustomTexture = {
					order = 6,
					type = 'input',
					width = 'full',
					name = L["Custom Texture"],
					disabled = function() return E.db.sle.unitframes.unit[group].offline.texture ~= "CUSTOM" end,
				},
			},
		}
		return config
	end
	
	local function CreateAurasConfig(unitID)
		local config = {
			order = 6,
			name = L["Auras"],
			type = "group",
			guiInline = true,
			args = {
				buffs = {
					order = 1,
					type = "group",
					guiInline = true,
					name = L["Buffs"],
					get = function(info) return E.db.sle.unitframes.unit[unitID].auras.buffs[ info[#info] ] end,
					set = function(info, value) E.db.sle.unitframes.unit[unitID].auras.buffs[ info[#info] ] = value; end,
					args = {
						threshold = {
							type = "range",
							order = 1,
							name = L["Low Threshold"],
							desc = L["Threshold before text turns red and is in decimal form. Set to -1 for it to never turn red"],
							min = -1, max = 20, step = 1,
						},
					},
				},
				debuffs = {
					order = 2,
					type = "group",
					guiInline = true,
					name = L["Debuffs"],
					get = function(info) return E.db.sle.unitframes.unit[unitID].auras.debuffs[ info[#info] ] end,
					set = function(info, value) E.db.sle.unitframes.unit[unitID].auras.debuffs[ info[#info] ] = value; end,
					args = {
						threshold = {
							type = "range",
							order = 1,
							name = L["Low Threshold"],
							desc = L["Threshold before text turns red and is in decimal form. Set to -1 for it to never turn red"],
							min = -1, max = 20, step = 1,
						},
					},
				},
			},
		}
		return config
	end

	E.Options.args.sle.args.modules.args.unitframes = {
		type = "group",
		name = L["UnitFrames"],
		order = 22,
		childGroups = 'tab',
		disabled = function() return not E.private.unitframe.enable end,
		args = {
			info = {
				order = 1,
				type = "description",
				name = L["Options for customizing unit frames. Please don't change these setting when ElvUI's testing frames for bosses and arena teams are shown. That will make them invisible until retoggling."],
			},
			Reset = {
				order = 2,
				type = 'execute',
				name = L["Restore Defaults"],
				desc = L["Reset these options to defaults"],
				func = function() SLE:Reset("unitframes") end,
			},
			roleicons = {
				order = 3,
				type = "select",
				name = L["LFG Icons"],
				desc = L["Choose what icon set will unitframes and chat use."],
				get = function(info) return E.db.sle.unitframes.roleicons end,
				set = function(info, value) E.db.sle.unitframes.roleicons = value; E:GetModule('Chat'):CheckLFGRoles(); UF:UpdateAllHeaders() end,
				values = {
					["ElvUI"] = "ElvUI ".."|T"..texPathE.."tank:15:15:0:0:64:64:2:56:2:56|t ".."|T"..texPathE.."healer:15:15:0:0:64:64:2:56:2:56|t ".."|T"..texPathE.."dps:15:15:0:0:64:64:2:56:2:56|t ",
					["SupervillainUI"] = "Supervillain UI ".."|T"..texPath.."svui-tank:15:15:0:0:64:64:2:56:2:56|t ".."|T"..texPath.."svui-healer:15:15:0:0:64:64:2:56:2:56|t ".."|T"..texPath.."svui-dps:15:15:0:0:64:64:2:56:2:56|t ",
					["Blizzard"] = "Blizzard ".."|T"..texPath.."blizz-tank:15:15:0:0:64:64:2:56:2:56|t ".."|T"..texPath.."blizz-healer:15:15:0:0:64:64:2:56:2:56|t ".."|T"..texPath.."blizz-dps:15:15:0:0:64:64:2:56:2:56|t ",
					["MiirGui"] = "MiirGui ".."|T"..texPath.."mg-tank:15:15:0:0:64:64:2:56:2:56|t ".."|T"..texPath.."mg-healer:15:15:0:0:64:64:2:56:2:56|t ".."|T"..texPath.."mg-dps:15:15:0:0:64:64:2:56:2:56|t ",
					["Lyn"] = "Lyn ".."|T"..texPath.."lyn-tank:15:15:0:0:64:64:2:56:2:56|t ".."|T"..texPath.."lyn-healer:15:15:0:0:64:64:2:56:2:56|t ".."|T"..texPath.."lyn-dps:15:15:0:0:64:64:2:56:2:56|t ",
				},
			},
			player = {
				order = 10,
				type = "group",
				name = L["Player Frame"],
				args = {
					higherPortrait = {
						order = 1, type = "toggle",
						name = L["Higher Overlay Portrait"],
						desc = L["Makes frame portrait visible regardles of health level when overlay portrait is set."],
						get = function(info) return E.db.sle.unitframes.unit.player[ info[#info] ] end,
						set = function(info, value) E.db.sle.unitframes.unit.player[ info[#info] ] = value; UF:CreateAndUpdateUF('player'); end,
					},
					portraitAlpha = {
						order = 2, type = 'range',
						name = L["Overlay Portrait Alpha"],
						isPercent = true,
						 min = 0, max = 1, step = 0.01,
						get = function(info) return E.db.sle.unitframes.unit.player[ info[#info] ] end,
						set = function(info, value) E.db.sle.unitframes.unit.player[ info[#info] ] = value; UF:CreateAndUpdateUF('player'); end,
					},
					combaticon = {
						order = 3,
						type = "group",
						name = L["Combat Icon"],
						guiInline = true,
						get = function(info) return E.db.sle.unitframes.unit.player.combatico[ info[#info] ] end,
						set = function(info, value) E.db.sle.unitframes.unit.player.combatico[ info[#info] ] = value; ElvUF_Player.CombatIndicator:PostUpdate(); SUF:TestCombat() end,
						args = {
							xoffset = { order = 1, type = 'range', name = L["X-Offset"], min = -300, max = 300, step = 1 },
							yoffset = { order = 2, type = 'range', name = L["Y-Offset"], min = -150, max = 150, step = 1 },
							size = { order = 3, type = 'range', name = L["Size"], min = 10, max = 60, step = 1 },
							red = { order = 4, type = "toggle", name = L["Red Icon"] },
							texture = {
								order = 5,
								type = "select",
								name = L["Texture"],
								values = {
									["DEFAULT"] = DEFAULT,
									["PLATINUM"] = [[|TInterface\Challenges\ChallengeMode_Medal_Platinum:14|t]],
									["ATTACK"] = [[|TInterface\CURSOR\Attack:14|t]],
									["ALERT"] = [[|TInterface\DialogFrame\UI-Dialog-Icon-AlertNew:14|t]],
									["SKULL"] = [[|TInterface\LootFrame\LootPanel-Icon:14|t]],
									["ARTHAS"] =[[|TInterface\LFGFRAME\UI-LFR-PORTRAIT:14|t]],
									["SVUI"] = "Supervillian UI",
								},
							},
						},
					},
					rested = {
						order = 4,
						type = "group",
						name = L["Rest Icon"],
						guiInline = true,
						get = function(info) return E.db.sle.unitframes.unit.player.rested[ info[#info] ] end,
						set = function(info, value) E.db.sle.unitframes.unit.player.rested[ info[#info] ] = value; UF:Configure_RestingIndicator(_G["ElvUF_Player"]) end,
						args = {
							xoffset = { order = 1, type = 'range', name = L["X-Offset"], min = -300, max = 300, step = 1 },
							yoffset = { order = 2, type = 'range', name = L["Y-Offset"], min = -150, max = 150, step = 1 },
							size = { order = 3, type = 'range', name = L["Size"], min = 10, max = 60, step = 1 },
							texture = {
								order = 5,
								type = "select",
								name = L["Texture"],
								values = {
									["DEFAULT"] = DEFAULT,
									["SVUI"] = "Supervillian UI",
									["CUSTOM"] = CUSTOM,
								},
							},
							customTexture = {
								order = 6,
								type = 'input',
								width = 'full',
								name = L["Custom Texture"],
								disabled = function() return E.db.sle.unitframes.unit.player.rested.texture ~= "CUSTOM" end,
							},
						},
					},
					pvpIconText = {
						order = 5,
						type = "group",
						name = L["PvP & Prestige Icon"],
						guiInline = true,
						get = function(info) return E.db.sle.unitframes.unit.player.pvpIconText[ info[#info] ] end,
						set = function(info, value) E.db.sle.unitframes.unit.player.pvpIconText[ info[#info] ] = value; UF:Configure_PVPIcon(_G["ElvUF_Player"]) end,
						args = {
							enable = { order = 1, type = "toggle", name = L["Enable"], },
							xoffset = { order = 2, type = "range", name = L["X-Offset"], min = -300, max = 300, step = 1 },
							yoffset = { order = 3, type = "range", name = L["Y-Offset"], min = -150, max = 150, step = 1 },
						},
						
					},
					auras = CreateAurasConfig("player"),
				},
			},
			target = {
				order = 11,
				type = "group",
				name = L["Target Frame"],
				args = {
					higherPortrait = {
						order = 1, type = "toggle",
						name = L["Higher Overlay Portrait"],
						desc = L["Makes frame portrait visible regardles of health level when overlay portrait is set."],
						get = function(info) return E.db.sle.unitframes.unit.target[ info[#info] ] end,
						set = function(info, value) E.db.sle.unitframes.unit.target[ info[#info] ] = value; UF:CreateAndUpdateUF('target'); end,
					},
					portraitAlpha = {
						order = 2, type = 'range',
						name = L["Overlay Portrait Alpha"],
						isPercent = true,
						 min = 0, max = 1, step = 0.01,
						get = function(info) return E.db.sle.unitframes.unit.target[ info[#info] ] end,
						set = function(info, value) E.db.sle.unitframes.unit.target[ info[#info] ] = value; UF:CreateAndUpdateUF('target'); end,
					},
					auras = CreateAurasConfig("target"),
				},
			},
			focus = {
				order = 12,
				type = "group",
				name = L["Focus Frame"],
				args = {
					higherPortrait = {
						order = 1, type = "toggle",
						name = L["Higher Overlay Portrait"],
						desc = L["Makes frame portrait visible regardles of health level when overlay portrait is set."],
						get = function(info) return E.db.sle.unitframes.unit.focus[ info[#info] ] end,
						set = function(info, value) E.db.sle.unitframes.unit.focus[ info[#info] ] = value; UF:CreateAndUpdateUF('focus'); end,
					},
					portraitAlpha = {
						order = 2, type = 'range',
						name = L["Overlay Portrait Alpha"],
						isPercent = true,
						 min = 0, max = 1, step = 0.01,
						get = function(info) return E.db.sle.unitframes.unit.focus[ info[#info] ] end,
						set = function(info, value) E.db.sle.unitframes.unit.focus[ info[#info] ] = value; UF:CreateAndUpdateUF('focus'); end,
					},
				},
			},
			party = {
				order = 20,
				type = "group",
				name = L["Party Frames"],
				args = {
					configureToggle = {
						order = 1,
						type = 'execute',
						name = L["Display Frames"],
						func = function()
							UF:HeaderConfig(ElvUF_Party, ElvUF_Party.forceShow ~= true or nil)
						end,
					},
					higherPortrait = {
						order = 2, type = "toggle",
						name = L["Higher Overlay Portrait"],
						desc = L["Makes frame portrait visible regardles of health level when overlay portrait is set."],
						get = function(info) return E.db.sle.unitframes.unit.party[ info[#info] ] end,
						set = function(info, value) E.db.sle.unitframes.unit.party[ info[#info] ] = value; UF:CreateAndUpdateHeaderGroup('party') end,
					},
					portraitAlpha = {
						order = 3, type = 'range',
						name = L["Overlay Portrait Alpha"],
						isPercent = true,
						 min = 0, max = 1, step = 0.01,
						get = function(info) return E.db.sle.unitframes.unit.party[ info[#info] ] end,
						set = function(info, value) E.db.sle.unitframes.unit.party[ info[#info] ] = value; UF:CreateAndUpdateHeaderGroup('party') end,
					},
					offline = CreateOfflineConfig("party")
				},
			},
			raid = {
				order = 21,
				type = "group",
				name = L["Raid Frames"],
				args = {
					configureToggle = {
						order = 1,
						type = 'execute',
						name = L["Display Frames"],
						func = function()
							UF:HeaderConfig(_G['ElvUF_Raid'], _G['ElvUF_Raid'].forceShow ~= true or nil)
						end,
					},
					higherPortrait = {
						order = 2, type = "toggle",
						name = L["Higher Overlay Portrait"],
						desc = L["Makes frame portrait visible regardles of health level when overlay portrait is set."],
						get = function(info) return E.db.sle.unitframes.unit.raid[ info[#info] ] end,
						set = function(info, value) E.db.sle.unitframes.unit.raid[ info[#info] ] = value; UF:CreateAndUpdateHeaderGroup('raid') end,
					},
					portraitAlpha = {
						order = 3, type = 'range',
						name = L["Overlay Portrait Alpha"],
						isPercent = true,
						 min = 0, max = 1, step = 0.01,
						get = function(info) return E.db.sle.unitframes.unit.raid[ info[#info] ] end,
						set = function(info, value) E.db.sle.unitframes.unit.raid[ info[#info] ] = value; UF:CreateAndUpdateHeaderGroup('raid') end,
					},
					offline = CreateOfflineConfig("raid")
				},
			},
			raid40 = {
				order = 22,
				type = "group",
				name = L["Raid-40 Frames"],
				args = {
					configureToggle = {
						order = 1,
						type = 'execute',
						name = L["Display Frames"],
						func = function()
							UF:HeaderConfig(_G['ElvUF_Raid40'], _G['ElvUF_Raid40'].forceShow ~= true or nil)
						end,
					},
					higherPortrait = {
						order = 2, type = "toggle",
						name = L["Higher Overlay Portrait"],
						desc = L["Makes frame portrait visible regardles of health level when overlay portrait is set."],
						get = function(info) return E.db.sle.unitframes.unit.raid40[ info[#info] ] end,
						set = function(info, value) E.db.sle.unitframes.unit.raid40[ info[#info] ] = value; UF:CreateAndUpdateHeaderGroup('raid40') end,
					},
					portraitAlpha = {
						order = 3, type = 'range',
						name = L["Overlay Portrait Alpha"],
						isPercent = true,
						 min = 0, max = 1, step = 0.01,
						get = function(info) return E.db.sle.unitframes.unit.raid40[ info[#info] ] end,
						set = function(info, value) E.db.sle.unitframes.unit.raid40[ info[#info] ] = value; UF:CreateAndUpdateHeaderGroup('raid40') end,
					},
					offline = CreateOfflineConfig("raid40")
				},
			},
			boss = {
				order = 23,
				type = "group",
				name = L["Boss Frames"],
				args = {
					higherPortrait = {
						order = 1, type = "toggle",
						name = L["Higher Overlay Portrait"],
						desc = L["Makes frame portrait visible regardles of health level when overlay portrait is set."],
						get = function(info) return E.db.sle.unitframes.unit.boss[ info[#info] ] end,
						set = function(info, value) E.db.sle.unitframes.unit.boss[ info[#info] ] = value; UF:CreateAndUpdateHeaderGroup('boss') end,
					},
					portraitAlpha = {
						order = 2, type = 'range',
						name = L["Overlay Portrait Alpha"],
						isPercent = true,
						 min = 0, max = 1, step = 0.01,
						get = function(info) return E.db.sle.unitframes.unit.boss[ info[#info] ] end,
						set = function(info, value) E.db.sle.unitframes.unit.boss[ info[#info] ] = value; UF:CreateAndUpdateHeaderGroup('boss') end,
					},
				},
			},
			arena = {
				order = 24,
				type = "group",
				name = L["Arena Frames"],
				args = {
					higherPortrait = {
						order = 1, type = "toggle",
						name = L["Higher Overlay Portrait"],
						desc = L["Makes frame portrait visible regardles of health level when overlay portrait is set."],
						get = function(info) return E.db.sle.unitframes.unit.arena[ info[#info] ] end,
						set = function(info, value) E.db.sle.unitframes.unit.arena[ info[#info] ] = value; UF:CreateAndUpdateHeaderGroup('arena') end,
					},
					portraitAlpha = {
						order = 2, type = 'range',
						name = L["Overlay Portrait Alpha"],
						isPercent = true,
						 min = 0, max = 1, step = 0.01,
						get = function(info) return E.db.sle.unitframes.unit.arena[ info[#info] ] end,
						set = function(info, value) E.db.sle.unitframes.unit.arena[ info[#info] ] = value; UF:CreateAndUpdateHeaderGroup('arena') end,
					},
				},
			},
			statusbars = {
				order = 50,
				type = "group",
				name = L["Statusbars"],
				get = function(info) return E.db.sle.unitframes.statusTextures[info[#info]] end,
				set = function(info, value) E.db.sle.unitframes.statusTextures[info[#info]] = value; SUF:BuildStatusTable(); SUF:UpdateStatusBars() end,
				args = {
					power = {
						order = 1,
						type = "toggle",
						name = L["Power"],
						disabled = function() return SLE._Compatibility["ElvUI_CustomTweaks"] end,
						get = function(info) return E.private.sle.unitframe.statusbarTextures.power end,
						set = function(info, value) E.private.sle.unitframe.statusbarTextures.power = value; E:StaticPopup_Show("PRIVATE_RL") end,
					},
					powerTexture = {
						order = 2,
						type = "select", dialogControl = "LSM30_Statusbar",
						name = L["Power Texture"],
						disabled = function() return not E.private.unitframe.enable or not E.private.sle.unitframe.statusbarTextures.power or SLE._Compatibility["ElvUI_CustomTweaks"] end,
						values = AceGUIWidgetLSMlists.statusbar,
					},
					space = { order = 3, type = "description", name = "" },
					cast = {
						order = 4,
						type = "toggle",
						name = L["Castbar"],
						get = function(info) return E.private.sle.unitframe.statusbarTextures.cast end,
						set = function(info, value) E.private.sle.unitframe.statusbarTextures.cast = value; E:StaticPopup_Show("PRIVATE_RL") end,
					},
					castTexture = {
						order = 5,
						type = "select", dialogControl = "LSM30_Statusbar",
						name = L["Castbar Texture"],
						disabled = function() return not E.private.unitframe.enable or not E.private.sle.unitframe.statusbarTextures.cast end,
						values = AceGUIWidgetLSMlists.statusbar,
					},
					space2 = { order = 6, type = "description", name = "" },
					aura = {
						order = 7,
						type = "toggle",
						name = L["Aura Bars"],
						get = function(info) return E.private.sle.unitframe.statusbarTextures.aura end,
						set = function(info, value) E.private.sle.unitframe.statusbarTextures.aura = value; E:StaticPopup_Show("PRIVATE_RL") end,
					},
					auraTexture = {
						order = 8,
						type = "select", dialogControl = "LSM30_Statusbar",
						name = L["Aura Bars Texture"],
						disabled = function() return not E.private.unitframe.enable or not E.private.sle.unitframe.statusbarTextures.aura end,
						values = AceGUIWidgetLSMlists.statusbar,
					},
					space3 = { order = 9, type = "description", name = "" },
					class = {
						order = 10,
						type = "toggle",
						name = L["Classbar"],
						get = function(info) return E.private.sle.unitframe.statusbarTextures.class end,
						set = function(info, value) E.private.sle.unitframe.statusbarTextures.class = value; E:StaticPopup_Show("PRIVATE_RL") end,
					},
					classTexture = {
						order = 11,
						type = "select", dialogControl = "LSM30_Statusbar",
						name = L["Classbar Texture"],
						disabled = function() return not E.private.unitframe.enable or not E.private.sle.unitframe.statusbarTextures.class end,
						set = function(info, value) E.db.sle.unitframes.statusTextures[info[#info]] = value; UF:CreateAndUpdateUF('player') end,
						values = AceGUIWidgetLSMlists.statusbar,
					},
					space4 = { order = 12, type = "description", name = "" },
					resizePrediction = {
						order = 13,
						type = "toggle",
						name = L["Resize Health Prediction"],
						desc = L["Slightly chages size of health prediction bars."],
						get = function(info) return E.private.sle.unitframe.resizeHealthPrediction end,
						set = function(info, value) E.private.sle.unitframe.resizeHealthPrediction = value; E:StaticPopup_Show("PRIVATE_RL") end,
					},
				},
			},
		},
	}
end

T.tinsert(SLE.Configs, configTable)
