local GSA = GladiatorlosSA
local gsadb
local AceConfigDialog = LibStub("AceConfigDialog-3.0")
local AceConfig = LibStub("AceConfig-3.0")
local L = LibStub("AceLocale-3.0"):GetLocale("GladiatorlosSA")
local LSM = LibStub("LibSharedMedia-3.0")

local GSA_OUTPUT = {["MASTER"] = "Master",["SFX"] = "SFX",["AMBIENCE"] = "Ambience",["MUSIC"] = "Music"} -- TTTTTTTTTTTRRRRRRRRRRRAAAAAAAADDDDDDD

function GSA:ShowConfig()
	for i=1,2 do InterfaceOptionsFrame_OpenToCategory(GetAddOnMetadata("GladiatorlosSA", "Title")) end -- ugly fix
end

function GSA:ChangeProfile()
	gsadb = self.db1.profile
	for k,v in GladiatorlosSA:IterateModules() do
		if type(v.ChangeProfile) == 'function' then
			v:ChangeProfile()
		end
	end
end

function GSA:AddOption(name, keyName)
	return AceConfigDialog:AddToBlizOptions("GladiatorlosSA", name, "GladiatorlosSA", keyName)
end

local function setOption(info, value)
	local name = info[#info]
	gsadb[name] = value
	if value then
		PlaySoundFile("Interface\\Addons\\"..gsadb.path_menu.."\\"..name..".ogg",gsadb.output_menu);
	end
end
local function getOption(info)
	local name = info[#info]
	return gsadb[name]
end
local function spellOption(order, spellID, ...)
	local spellname, _, icon = GetSpellInfo(spellID)				
	if (spellname ~= nil) then
		return {
			type = 'toggle',
			name = "\124T" .. icon .. ":24\124t" .. spellname,							
			desc = function () 
				GameTooltip:SetHyperlink(GetSpellLink(spellID));
				--GameTooltip:Show();
			end,
			descStyle = "custom",
					order = order,
		}
	else
		GSA.log("spell id: " .. spellID .. " is invalid")
		return {
			type = 'toggle',
			name = "unknown spell, id:" .. spellID,	
			order = order,
		}
	end
end

local function listOption(spellList, listType, ...)
	local args = {}
	for k, v in pairs(spellList) do
		if GSA.spellList[listType][v] then
			rawset (args, GSA.spellList[listType][v] ,spellOption(k, v))
		else 
		--[[debug
			print (v)
		]]
		end
	end
	return args
end

function GSA:MakeCustomOption(key)
	local options = self.options.args.custom.args
	local db = gsadb.custom
	options[key] = {
		type = 'group',
		name = function() return db[key].name end,
		set = function(info, value) local name = info[#info] db[key][name] = value end,
		get = function(info) local name = info[#info] return db[key][name] end,
		order = db[key].order,
		args = {
			name = {
				name = L["name"],
				type = 'input',
				set = function(info, value)
					if db[value] then GSA.log(L["same name already exists"]) return end
					db[value] = db[key]
					db[value].name = value
					db[value].order = #db + 1
					db[value].soundfilepath = "Interface\\AddOns\\GladiatorlosSA\\Voice_Custom\\"..value..".ogg"
					db[key] = nil
					--makeoption(value)
					options[value] = options[key]
					options[key] = nil
					key = value
				end,
				order = 10,
			},
			spellid = {
				name = L["spellid"],
				type = 'input',
				order = 20,
				pattern = "%d+$",
			},
			remove = {
				type = 'execute',
				order = 25,
				name = L["Remove"],
				confirm = true,
				confirmText = L["Are you sure?"],
				func = function() 
					db[key] = nil
					options[key] = nil
				end,
			},
			existingsound = {
				name = L["Use existing sound"],
				type = 'toggle',
				--disabled = true,
				order = 41, -- 30
			},
			soundfilepath = {
				name = L["file path"],
				type = 'input',
				width = 'double',
				order = 27,
				disabled = function() return db[key].existingsound end,
			},
			test = {
				type = 'execute',
				order = 28,
				name = L["Test"],
				disabled = function() return db[key].existingsound end,
				func = function() PlaySoundFile(db[key].soundfilepath, "Master") end,
			},
			NewLinetest = {
					type= 'description',
					order = 29,
					name= '',
			},
			existinglist = {
				name = L["choose a sound"],
				type = 'select',
				dialogControl = 'LSM30_Sound',
				values =  LSM:HashTable("sound"),
				--get = function()
				--	return current
				--end,
				--set = function(self,key)
				--	current = key
				--end,
				--values =  AceGUIWidgetLSMlists.sound,
				--values = function() return AceGUIWidgetLSMlists.sound end,
				disabled = function() return not db[key].existingsound end,
				order = 40,
			},
			NewLine3 = {
				type= 'description',
				order = 45,
				name= '',
			},
			eventtype = {
				type = 'multiselect',
				order = 50,
				name = L["event type"],
				values = self.GSA_EVENT,
				get = function(info, k) return db[key].eventtype[k] end,
				set = function(info, k, v) db[key].eventtype[k] = v end,
			},
			sourceuidfilter = {
				type = 'select',
				order = 61,
				name = L["Source unit"],
				values = self.GSA_UNIT,
			},
			sourcetypefilter = {
				type = 'select',
				order = 59,
				name = L["Source type"],
				values = self.GSA_TYPE,
			},
			sourcecustomname = {
				type= 'input',
				order = 62,
				name= L["Custom unit name"],
				disabled = function() return not (db[key].sourceuidfilter == "custom") end,
			},
			destuidfilter = {
				type = 'select',
				order = 65,
				name = L["Dest unit"],
				values = self.GSA_UNIT,
			},
			desttypefilter = {
				type = 'select',
				order = 60,
				name = L["Dest type"],
				values = self.GSA_TYPE,
			},
			destcustomname = {
				type= 'input',
				order = 68,
				name = L["Custom unit name"],
				disabled = function() return not (db[key].destuidfilter == "custom") end,
			},
			--[[NewLine5 = {
				type = 'header',
				order = 69,
				name = "",
			},]]
		}
	}
end
	

function GSA:OnOptionCreate()
	gsadb = self.db1.profile
	
	self.options = {
		type = "group",
		name = GetAddOnMetadata("GladiatorlosSA", "Title"),
		args = {
			general = {
				type = 'group',
				name = L["General"],
				desc = L["General options"],
				set = setOption,
				get = getOption,
				order = 1,
				args = {
					enableArea = {
						type = 'group',
						inline = true,
						name = L["Enable area"],
						order = 1,
						args = {
							all = {
								type = 'toggle',
								name = L["Anywhere"],
								desc = L["Alert works anywhere"],
								order = 1,
							},
							arena = {
								type = 'toggle',
								name = L["Arena"],
								desc = L["Alert only works in arena"],
								disabled = function() return gsadb.all end,
								order = 2,
							},
							NewLine1 = {
								type= 'description',
								order = 3,
								name= '',
							},
							battleground = {
								type = 'toggle',
								name = L["Battleground"],
								desc = L["Alert only works in BG"],
								disabled = function() return gsadb.all end,
								order = 4,
							},
							field = {
								type = 'toggle',
								name = L["World"],
								desc = L["Alert works anywhere else then anena, BG, dungeon instance"],
								disabled = function() return gsadb.all end,
								order = 5,
							}
						},
					},
					voice = {
						type = 'group',
						inline = true,
						name = L["Voice config"],
						order = 2,
						args = {
							path = {
								type = 'select',
								--name = L["Voice language"],
								name = L["Default / Female voice"], -- added to 2.3
								--desc = L["Select language of the alert"],
								desc = L["Select the default voice pack of the alert"], -- added to 2.3
								values = self.GSA_LANGUAGE,
								order = 1,
							},
							path_male = {
								type = 'select',
								name = L["Optional / Male voice"], -- added to 2.3
								desc = L["Select the male voice"], -- added to 2.3
								values = self.GSA_LANGUAGE,
								order = 2,
								disabled = function() return not gsadb.genderVoice end,
							},
							path_neutral = {
								type = 'select',
								name = L["Optional / Neutral voice"], -- added to 2.3
								desc = L["Select the neutral voice"], -- added to 2.3
								values = self.GSA_LANGUAGE,
								order = 3,
								disabled = function() return not gsadb.genderVoice end,
							},
							genderVoice = {
								name = L["Gender detection"], -- added to 2.3
								type = 'toggle',
								desc = L["Activate the gender detection"], -- added to 2.3
								order = 4,
							},
							NewLinev = {
								type= 'description',
								order = 7,
								name= '',
							},
							volumn = {
								type = 'range',
								max = 1,
								min = 0,
								step = 0.1,
								name = "Master Volume", -- TTTTTTRRRRRAAAAAAAAAAAAAAAADDDDDDDDDDDDDD
								desc = L["adjusting the voice volume(the same as adjusting the system master sound volume)"],
								set = function (info, value) SetCVar ("Sound_MasterVolume",tostring (value)) end,
								get = function () return tonumber (GetCVar ("Sound_MasterVolume")) end,
								order = 6,
							},
						},
					},
					advance = {
						type = 'group',
						inline = true,
						name = L["Advance options"],
						order = 3,
						args = {
							smartDisable = {
								type = 'toggle',
								name = L["Smart disable"],
								desc = L["Disable addon for a moment while too many alerts comes"],
								order = 1,
							},
							throttle = {
								type = 'range',
								max = 5,
								min = 0,
								step = 0.1,
								name = L["Throttle"],
								desc = L["The minimum interval of each alert"],
								disabled = function() return not gsadb.smartDisable end,
								order = 2,
							},
							NewLineOutput = {
								type= 'description',
								order = 3,
								name= '',
							},
							outputUnlock = {
								type = 'toggle',
								name = "Change Output", -- TTTTTTTRRRRRRRRRAAAAAAAAAAAAADDDDDDDD
								desc = "Unlock the output options", -- TTTTTTTTRRRRRRRRRRRRAAAAAAAAADDDDDDDDDDD
								order = 8,
								confirm = true,
								confirmText = L["Are you sure?"],
							},
							output_menu = {
								type = 'select',
								name = "Output", -- TTTTTTTTRRRRRRRRRRRAAAAAAAAADDDDDDDDDDDDDD
								desc = "Select the default output", -- TTTTTTRRRRRRRRRRRRAAAAAAAADDDDDDDDDDDDD
								values = GSA_OUTPUT,
								order = 10,
								disabled = function() return not gsadb.outputUnlock end,
							},
						},
					},
				},
			},
			spells = {
				type = 'group',
				name = L["Abilities"],
				desc = L["Abilities options"],
				set = setOption,
				get = getOption,
				childGroups = "tab",
				order = -2,
				args = {
				menu_voice = {
						type = 'group',
						inline = true,
						name = L["Voice menu config"], -- added to 2.3
						order = -2,
						args = {
							path_menu = {
								type = 'select',
								name = L["Choose a test voice pack"], -- added to 2.3
								desc = L["Select the menu voice pack alert"], -- added to 2.3.1
								values = self.GSA_LANGUAGE,
								order = 1,
							},

						},
				},
				spellGeneral = {
						type = 'group',
						name = L["Disable options"],
						desc = L["Disable abilities by type"],
						inline = true,
						order = -1,
						args = {
							aruaApplied = {
								type = 'toggle',
								name = L["Disable Buff Applied"],
								desc = L["Check this will disable alert for buff applied to hostile targets"],
								order = 1,
							},
							aruaRemoved = {
								type = 'toggle',
								name = L["Disable Buff Down"],
								desc = L["Check this will disable alert for buff removed from hostile targets"],
								order = 2,
							},
							castStart = {
								type = 'toggle',
								name = L["Disable Spell Casting"],
								desc = L["Chech this will disable alert for spell being casted to friendly targets"],
								order = 3,
							},
							castSuccess = {
								type = 'toggle',
								name = L["Disable special abilities"],
								desc = L["Check this will disable alert for instant-cast important abilities"],
								order = 4,
							},
							interrupt = {
								type = 'toggle',
								name = L["Disable friendly interrupt"],
								desc = L["Check this will disable alert for successfully-landed friendly interrupting abilities"],
								order = 5,
							}
						},
					},
					spellAuraApplied = {
						type = 'group',
						--inline = true,
						name = L["Buff Applied"],
						disabled = function() return gsadb.aruaApplied end,
						order = 1,
						args = {
							aonlyTF = {
								type = 'toggle',
								name = L["Target and Focus Only"],
								desc = L["Alert works only when your current target or focus gains the buff effect or use the ability"],
								order = 1,
							},
							drinking = { 
								type = 'toggle',
								name = L["Alert Drinking"],
								desc = L["In arena, alert when enemy is drinking"],
								order = 3,
							},
							--general = {
							--	type = 'group',
							--	inline = true,
							--	name = L["General Abilities"],
							--	order = 4,
							--	args = listOption({42292,20594,7744},"auraApplied"),
							--},
							dk	= {
								type = 'group',
								inline = true,
								name = L["|cffC41F3BDeath Knight|r"],
								order = 5,
								args = listOption({49039,48792,55233,51271,48707,115989,152279},"auraApplied"),
							},
							druid = {
								type = 'group',
								inline = true,
								name = L["|cffFF7D0ADruid|r"],
								order = 6,
								args = listOption({61336,22812,132158,22842,1850,50334,69369,124974,112071,102342,102351,155835},"auraApplied"),
							},
							hunter = {
								type = 'group',
								inline = true,
								name = L["|cffABD473Hunter|r"],
								order = 7,
								args = listOption({19263,3045,54216,53480},"auraApplied"), -- 53480 added pet skill
							},
							mage = {
								type = 'group',
								inline = true,
								name = L["|cff69CCF0Mage|r"],
								order = 8,
								args = listOption({45438,12042,12472,12043,108839,110909},"auraApplied"),
							},
							monk = {
								type = 'group',
								inline = true,
								name = L["|cFF558A84Monk|r"],
								order = 9,
								args = listOption({120954,122278,122783,115176,116849,152175,152173,122470},"auraApplied"), --@ add 122470 from SpellcastStart / del 115294 2.2.2
							},
							paladin = {
								type = 'group',
								inline = true,
								name = L["|cffF58CBAPaladin|r"],
								order = 10,
								args = listOption({1022,1044,642,6940,31884,114917,114039,105809,31842,152262},"auraApplied"), --del 114163,20925 2.2.2
							},
							preist	= {
								type = 'group',
								inline = true,
								name = L["|cffFFFFFFPriest|r"],
								order = 11,
								args = listOption({10060,33206,6346,47585,81700,47788,109964,17},"auraApplied"), --@ del 37274,112833 add 17 2.2.2
							},
							rogue = {
								type = 'group',
								inline = true,
								name = L["|cffFFF569Rogue|r"],
								order = 12,
								args = listOption({51713,2983,31224,13750,5277,74001,114018,152151,51690},"auraApplied"), -- add 51690 2.2.2
							},
							shaman	= {
								type = 'group',
								inline = true,
								name = L["|cff0070daShaman|r"],
								order = 13,
								args = listOption({30823,974,16188,79206,16166,52127,118350,118347,114050,114051,114052},"auraApplied"), -- 118350,118347 moved from castsuccess - [114050/114051/114052 Ascendance (burst)]
							},
							warlock	= {
								type = 'group',
								inline = true,
								name = L["|cff9482C9Warlock|r"],
								order = 14,
								args = listOption({108416,108503,104773,113858,113861,113860},"auraApplied"), -- [113861,113860,113858 Dark Soul (burst)]
							},
							warrior	= {
								type = 'group',
								inline = true,
								name = L["|cffC79C6EWarrior|r"],
								order = 15,
								args = listOption({55694,871,112048,18499,23920,12328,46924,12292,1719,107574,114029,114030},"auraApplied"),
							},
						},
					},
					spellAuraRemoved = {
						type = 'group',
						--inline = true,
						name = L["Buff Down"],
						disabled = function() return gsadb.aruaRemoved end,
						order = 2,
						args = {
							ronlyTF = {
								type = 'toggle',
								name = L["Target and Focus Only"],
								desc = L["Alert works only when your current target or focus gains the buff effect or use the ability"],
								order = 1,
							},
							dk = {
								type = 'group',
								inline = true,
								name = L["|cffC41F3BDeath Knight|r"],
								order = 4,
								args = listOption({48792,49039,48707},"auraRemoved"),
							},
							--druid = {
							--	type = 'group',
							--	inline = true,
							--	name = L["|cffFF7D0ADruid|r"],
							--	order = 5,
							--	args = listOption({},"auraRemoved"), --@ 106922,110617,110696,110700,110715,110788,126456,126453 removed (All) WoD
							--},
							hunter = {
								type = 'group',
								inline = true,
								name = L["|cffABD473Hunter|r"],
								order = 6,
								args = listOption({19263},"auraRemoved"),
							},
							mage = {
								type = 'group',
								inline = true,
								name = L["|cff69CCF0Mage|r"],
								order = 7,
								args = listOption({45438},"auraRemoved"),
							},
							monk = {
								type = 'group',
								inline = true,
								name = L["|cFF558A84Monk|r"],
								order = 9,
								args = listOption({120954,115176,122470},"auraRemoved"),
							},
							paladin = {
								type = 'group',
								inline = true,
								name = L["|cffF58CBAPaladin|r"],
								order = 10,
								args = listOption({1022,642},"auraRemoved"),
							},
							preist	= {
								type = 'group',
								inline = true,
								name = L["|cffFFFFFFPriest|r"],
								order = 11,
								args = listOption({33206,47585,109964},"auraRemoved"),
							},
							rogue = {
								type = 'group',
								inline = true,
								name = L["|cffFFF569Rogue|r"],
								order = 12,
								args = listOption({31224,5277,74001,51690},"auraRemoved"), -- add 51690 2.2.2
							},
							shaman	= {
								type = 'group',
								inline = true,
								name = L["|cff0070daShaman|r"],
								order = 13,
								args = listOption({108271,118350,118347},"auraRemoved"),
							},
							warrior	= {
								type = 'group',
								inline = true,
								name = L["|cffC79C6EWarrior|r"],
								order = 14,
								args = listOption({871,112048,114030},"auraRemoved"), --@ 103827 (double charge) removed (maybe a mistake:p)
							},
						},
					},
					spellCastStart = {
						type = 'group',
						--inline = true,
						name = L["Spell Casting"],
						disabled = function() return gsadb.castStart end,
						order = 2,
						args = {
							conlyTF = {
								type = 'toggle',
								name = L["Target and Focus Only"],
								desc = L["Alert works only when your current target or focus gains the buff effect or use the ability"],
								order = 1,
							},
							general = {
								type = 'group',
								inline = true,
								name = L["General Abilities"],
								order = 3,
								args = {
									bigHeal = {
										type = 'toggle',
										name = L["Big Heals"],
										desc = L["Greater Heal, Divine Light, Greater Healing Wave, Healing Touch, Enveloping Mist"],
										order = 1,
									},
									resurrection = {
										type = 'toggle',
										name = L["Resurrection"],
										desc = L["Resurrection, Redemption, Ancestral Spirit, Revive, Resuscitate"],
										order = 2,
									},
								}
							},
							druid = {
								type = 'group',
								inline = true,
								name = L["|cffFF7D0ADruid|r"],
								order = 4,
								args = listOption({33786,339},"castStart"),
							},
							hunter = {
								type = 'group',
								inline = true,
								name = L["|cffABD473Hunter|r"],
								order = 5,
								args = listOption({982,120360,109259,19386},"castStart"), -- 19386 moved from cast-success 2.3.4
							},
							mage = {
								type = 'group',
								inline = true,
								name = L["|cff69CCF0Mage|r"],
								order = 6,
								args = listOption({118,102051},"castStart"),
							},
							--monk = {
							--	type = 'group',
							--	inline = true,
							--	name = L["|cFF558A84Monk|r"],
							--	order = 7,
							--	args = listOption({},"castStart"), --@ 113275 removed ( All )
							--},
							paladin = {
								type = 'group',
								inline = true,
								name = L["|cffF58CBAPaladin|r"],
								order = 8,
								args = listOption({20066,115750},"castStart"),
							},
							preist	= {
								type = 'group',
								inline = true,
								name = L["|cffFFFFFFPriest|r"],
								order = 9,
								args = listOption({9484,605,32375},"castStart"),
							},
							shaman	= {
								type = 'group',
								inline = true,
								name = L["|cff0070daShaman|r"],
								order = 10,
								args = listOption({51514},"castStart"),
							},
							warlock	= {
								type = 'group',
								inline = true,
								name = L["|cff9482C9Warlock|r"],
								order = 11,
								args = listOption({5782,710,152108,691,712,697,688,112866,112867,112870,112868,112869},"castStart"), -- [691,712,697,688,112866,112867,112870,112868,112869 summ' demon]
							},
							--dk	= {
								--type = 'group',
								--inline = true,
								--name = L["|cffC41F3BDeath Knight|r"],
								--order = 9,
								--args = listOption({49203},"castStart"),
							--},			
						},
					},
					spellCastSuccess = {
						type = 'group',
						--inline = true,
						name = L["Special Abilities"],
						disabled = function() return gsadb.castSuccess end,
						order = 3,
						args = {
							sonlyTF = {
								type = 'toggle',
								name = L["Target and Focus Only"],
								desc = L["Alert works only when your current target or focus gains the buff effect or use the ability"],
								order = 1,
							},
							class = {
								type = 'toggle',
								name = L["PvP Trinketed Class"],
								desc = L["Also announce class name with trinket alert when hostile targets use PvP trinket in arena"],
								disabled = function() return not gsadb.trinket end,
								order = 3,
							},
							general = {
								type = 'group',
								inline = true,
								name = L["General Abilities"],
								order = 4,
								args = listOption({58984,20594,7744,42292},"castSuccess"),
							},
							dk	= {
								type = 'group',
								inline = true,
								name = L["|cffC41F3BDeath Knight|r"],
								order = 5,
								args = listOption({47528,47476,47568,49206,77606,108194,108199,108201,108200,152280},"castSuccess"),
							},
							druid = {
								type = 'group',
								inline = true,
								name = L["|cffFF7D0ADruid|r"],
								order = 6,
								args = listOption({102280,740,78675,108238,102693,102703,102706,99,5211,102560,102543,102558,33891,102359,33831,102417,102383,49376,16979,102416,102401,106839},"castSuccess"), -- add 106839 to 2.2.2 / [102417,102383,49376,16979,102416,102401 wildcharge]
							},
							hunter = {
								type = 'group',
								inline = true,
								name = L["|cffABD473Hunter|r"],
								order = 7,
								args = listOption({147362,60192,1499,109248,109304,131894,120697,121818,19801,126216,126215,126214,126213,122811,122809,122807,122806,122804,122802,121118},"castSuccess"), -- 19801 added to 2.2.2 [126215,126216,126214,126213,122811,122809,122807,122806,122804,122802,121118 Dire beast]
							},
							mage = {
								type = 'group',
								inline = true,
								name = L["|cff69CCF0Mage|r"],
								order = 8,
								args = listOption({11129,11958,44572,2139,66,12051,113724,110959,152087,153595,153561},"castSuccess"),
							},
							monk = {
								type = 'group',
								inline = true,
								name = L["|cFF558A84Monk|r"],
								order = 9,
								args = listOption({116841,115399,119392,119381,116847,123904,115078,115315,115313,116705,123761,119996,157535},"castSuccess"), --@ 122470 moved to SpellAuraApplied
							},
							paladin = {
								type = 'group',
								inline = true,
								name = L["|cffF58CBAPaladin|r"],
								order = 10,
								args = listOption({31821,96231,853,105593,85499},"castSuccess"),
							},
							preist	= {
								type = 'group',
								inline = true,
								name = L["|cffFFFFFFPriest|r"],
								order = 110,
								args = listOption({112833,8122,34433,64044,15487,64843,19236,108920,123040,121135,81209,81206,81208},"castSuccess"),
							},
							rogue = {
								type = 'group',
								inline = true,
								name = L["|cffFFF569Rogue|r"],
								order = 111,
								args = listOption({2094,1766,14185,1856,76577,79140},"castSuccess"),
							},
							shaman	= {
								type = 'group',
								inline = true,
								name = L["|cff0070daShaman|r"],
								order = 112,
								args = listOption({108271,8177,8143,98008,108270,51485,2484,108273,108285,108287,108280,108281,118345,2894,2062,108269,57994,152256,152255,370},"castSuccess"), -- 370 added to 2.2.2
							},
							warlock = {
								type = 'group',
								inline = true,
								name = L["|cff9482C9Warlock|r"],
								order = 113,
								args = listOption({108359,6789,5484,19647,48020,30283,111397,108482,104316,110913,111859,111895,111896,111897,111898},"castSuccess"),
							},
							warrior	= {
								type = 'group',
								inline = true,
								name = L["|cffC79C6EWarrior|r"],
								order = 114,
								args = listOption({97462,5246,6552,2457,71,107566,102060,46968,118000,107570,114192,114028,156287,176289,114028},"castSuccess"),
							},
						},
					},
					spellInterrupt = {
						type = 'group',
						--inline = true,
						name = L["Friendly Interrupt"],
						disabled = function() return gsadb.interrupt end,
						order = 4,
						args = {
							lockout = {
								type = 'toggle',
								name = L["Friendly Interrupt"],
								desc = L["Spell Lock, Counterspell, Kick, Pummel, Mind Freeze, Skull Bash, Rebuke, Solar Beam, Spear Hand Strike, Wind Shear"],
								order = 1,
							},
						}
					},
				},
			},
			custom = {
				type = 'group',
				name = L["Custom"],
				desc = L["Custom Spell"],
				--set = function(info, value) local name = info[#info] gsadb.custom[name] = value end,
				--get = function(info) local name = info[#info]	return gsadb.custom[name] end,
				order = 4,
				args = {
					newalert = {
						type = 'execute',
						name = L["New Sound Alert"],
						order = -1,
						--[[args = {
							newname = {
								type = 'input',
								name = "name",
								set = function(info, value) local name = info[#info] if gsadb.custom[vlaue] then log("name already exists") return end gsadb.custom[vlaue]={} end,			
							}]]
						func = function()
							gsadb.custom[L["New Sound Alert"]] = {
								name = L["New Sound Alert"],
								soundfilepath = "Interface\\AddOns\\GladiatorlosSA\\Voice_Custom\\Will-Demo.ogg",--"..L["New Sound Alert"]..".ogg",
								sourceuidfilter = "any",
								destuidfilter = "any",
								eventtype = {
									SPELL_CAST_SUCCESS = true,
									SPELL_CAST_START = false,
									SPELL_AURA_APPLIED = false,
									SPELL_AURA_REMOVED = false,
									SPELL_INTERRUPT = false,
								},
								sourcetypefilter = COMBATLOG_FILTER_EVERYTHING,
								desttypefilter = COMBATLOG_FILTER_EVERYTHING,
								order = 0,
							}
							self:MakeCustomOption(L["New Sound Alert"])
						end,
						disabled = function()
							if gsadb.custom[L["New Sound Alert"]] then
								return true
							else
								return false
							end
						end,
					}
				}
			},
			dump_main = {
				type = 'group',
				name = "Floody Dump",
				desc = "Dump options",
				set = setOption,
				get = getOption,
				order = -5,
				args = {
					dumpz = {
						type = 'group',
						inline = true,
						name = "Flooding dump enable", -- TTTTRRRRRRRRRRRAAAAAAAADDDDDDDDDD
						order = 1,
						args = {
							NewLinedump0 = {
								type= 'description',
								order = 0,
								name= "This function may causes |cffC41F3Bheavy latencies|r and |cffC41F3Bflood|r your default chat. |cffC41F3BDO NOT|r activate it without knowing what you are doing.",
							},
							NewLinedump4 = {
								type= 'description',
								order = 1,
								name= " ",
							},
							dumpUnlock = {
								type = 'toggle',
								name = "Unlock Dump Flood", -- TRRRRRRRRRAAAAAAAAAAAAADDDDDDDD
								desc = "Unlock the enable button", -- TRRRRRRRRRRRRAAAAAAAAADDDDDDDDDDD
								order = 2,
								confirm = true,
								confirmText = L["Are you sure?"],
								},
							dumpEnable = {
								type = 'toggle',
								name = "Dump enable", -- TRRRRRRRRRAAAAAAAAAAAAADDDDDDDD
								desc = "Enable flooding dump COMBAT_LOG_EVENT_UNFILTERED", -- TRRRRRRRRRRRRAAAAAAAAADDDDDDDDDDD
								disabled = function() return not gsadb.dumpUnlock end,
								order = 3,
								},
							NewLinedump1 = {
								type= 'description',
								order = 5,
								name= '',
							},
						}
					},
					dumpz2 = {
						type = 'group',
						inline = true,
						name = "Flooding dump filters", -- TTTTRRRRRRRRRRRAAAAAAAADDDDDDDDDD
						order = 2,
						args = {

							dumpEvent = {
								type = 'toggle',
								name = "Reduce Event name", -- TRRRRRRRRRAAAAAAAAAAAAADDDDDDDD
								desc = "Reduce Event name : SPELL_CAST_SUCCESS=|cffFF7D0ASC_Success|r SPELL_CAST_START=|cffFF7D0ASC_Start|r SPELL_AURA_APPLIED=|cffFF7D0ASA_Applied|r SPELL_AURA_REMOVED=|cffFF7D0ASA_Removed|r SPELL_SUMMON=|cffFF7D0AS_Summon|r", -- TRRRRRRRRRRRRAAAAAAAAADDDDDDDDDDD
								order = 7,
								disabled = function() return not gsadb.dumpEnable or not gsadb.dumpUnlock end,
							},
							dumpRealm = {
								type = 'toggle',
								name = "Hide Realm", -- TRRRRRRRRRAAAAAAAAAAAAADDDDDDDD
								desc = "Hide player Realm", -- TRRRRRRRRRRRRAAAAAAAAADDDDDDDDDDD
								order = 8,
								disabled = function() return not gsadb.dumpEnable or not gsadb.dumpUnlock end,
							},
							dumpMe = {
								type = 'toggle',
								name = "Hide My Spells", -- TRRRRRRRRRAAAAAAAAAAAAADDDDDDDD
								desc = "Hide My Spells", -- TRRRRRRRRRRRRAAAAAAAAADDDDDDDDDDD
								order = 9,
								disabled = function() return not gsadb.dumpEnable or not gsadb.dumpUnlock end,
							},
							dumpSpellLink = {
								type = 'toggle',
								name = "Show Spell Link", -- TRRRRRRRRRAAAAAAAAAAAAADDDDDDDD
								desc = "Show Spell Link", -- TRRRRRRRRRRRRAAAAAAAAADDDDDDDDDDD
								order = 10,
								disabled = function() return not gsadb.dumpEnable or not gsadb.dumpUnlock end,
							},
							dumpHostile = {
								type = 'toggle',
								name = "Hostile only", -- TRRRRRRRRRAAAAAAAAAAAAADDDDDDDD
								desc = "Only Dump spells throw by hostile", -- TRRRRRRRRRRRRAAAAAAAAADDDDDDDDDDD
								order = 11,
								disabled = function() return not gsadb.dumpEnable or not gsadb.dumpUnlock end,
							},
							NewLinedump6 = {
								type= 'description',
								order = 14,
								name= '',
							},
							dumpTargetAny = {
								type = 'toggle',
								name = "Target only - All", -- TRRRRRRRRRAAAAAAAAAAAAADDDDDDDD
								desc = "All about the actual target", -- TRRRRRRRRRRRRAAAAAAAAADDDDDDDDDDD
								order = 20,
								disabled = function() return not gsadb.dumpEnable or not gsadb.dumpUnlock end,
							},
							dumpTargetFrom = {
								type = 'toggle',
								name = "Target only - From", -- TRRRRRRRRRAAAAAAAAAAAAADDDDDDDD
								desc = "Only Dump spells throw by the actual target", -- TRRRRRRRRRRRRAAAAAAAAADDDDDDDDDDD
								order = 25,
								disabled = function() return not gsadb.dumpEnable or not gsadb.dumpUnlock end,
							},
							NewLinedump2 = {
								type= 'description',
								order =30,
								name= '',
							},
							dumpMiniDest = {
								type = 'toggle',
								name = "Reduce the Dest name", -- TRRRRRRRRRAAAAAAAAAAAAADDDDDDDD
								desc = "Reduce the number of character of the destination name", -- TRRRRRRRRRRRRAAAAAAAAADDDDDDDDDDD
								order = 35,
								disabled = function() return not gsadb.dumpEnable or not gsadb.dumpUnlock end,
							},
							dumpMiniDestRange = {
								type = 'range',
								max = 40,
								min = 1,
								step = 1,
								name = "Max char", -- TRRRRRRRRRAAAAAAAAAAAAADDDDDDDD
								desc = "Number of character to display", -- TRRRRRRRRRAAAAAAAAAAAAADDDDDDDD
								disabled = function() return not gsadb.dumpEnable or not gsadb.dumpMiniDest or not gsadb.dumpUnlock end,
								order = 40,
							},
							NewLinedump = {
								type= 'description',
								order = 45,
								name= '',
							},
							dumpMiniSource = {
								type = 'toggle',
								name = "Reduce the Source name", -- TRRRRRRRRRAAAAAAAAAAAAADDDDDDDD
								desc = "Reduce the number of character of the source name", -- TRRRRRRRRRRRRAAAAAAAAADDDDDDDDDDD
								order = 50,
								disabled = function() return not gsadb.dumpEnable or not gsadb.dumpUnlock end,
							},
							dumpMiniSourceRange = {
								type = 'range',
								max = 40,
								min = 1,
								step = 1,
								name = "Max char", -- TRRRRRRRRRAAAAAAAAAAAAADDDDDDDD
								desc = "Number of character to display", -- TRRRRRRRRRAAAAAAAAAAAAADDDDDDDD
								disabled = function() return not gsadb.dumpEnable or not gsadb.dumpMiniSource or not gsadb.dumpUnlock end,
								order = 55,
							},
							NewLinedump22 = {
								type= 'description',
								order = 60,
								name= '',
							},
							dumpIcon = {
								type = 'toggle',
								name = "Show icon", -- TRRRRRRRRRAAAAAAAAAAAAADDDDDDDD
								desc = "Show the icon of the spell", -- TRRRRRRRRRRRRAAAAAAAAADDDDDDDDDDD
								order = 61,
								disabled = function() return not gsadb.dumpEnable or not gsadb.dumpUnlock end,
							},
							dumpIconRange = {
								type = 'range',
								max = 40,
								min = 6,
								step = 1,
								name = "Icon size", -- TRRRRRRRRRAAAAAAAAAAAAADDDDDDDD
								desc = "Size of the icon", -- TRRRRRRRRRAAAAAAAAAAAAADDDDDDDD
								disabled = function() return not gsadb.dumpEnable or not gsadb.dumpIcon or not gsadb.dumpUnlock end,
								order = 62,
							},
						},
					},
				},
			}
		}
	}
	for k, v in pairs(gsadb.custom) do
		self:MakeCustomOption(k)
	end	
	AceConfig:RegisterOptionsTable("GladiatorlosSA", self.options)
	self:AddOption(L["General"], "general")
	self.options.args.profiles = LibStub("AceDBOptions-3.0"):GetOptionsTable(self.db1)
	self.options.args.profiles.order = -1
	
	self:AddOption(L["Abilities"], "spells")
	self:AddOption(L["Custom"], "custom")
	self:AddOption("Dump", "dump_main") -- ************************************************ TTTTTTTTTTTTRRRRRRRRRRAAAAAAAADDDDDDDDD
	self:AddOption(L["Profiles"], "profiles")
end