local L = LibStub("AceLocale-3.0"):GetLocale("Bartender4")
local ButtonBar = Bartender4.ButtonBar.prototype
local ActionBar = Bartender4.ActionBar

--[[===================================================================================
	ActionBar Options
===================================================================================]]--

local module = Bartender4:GetModule("ActionBars")

-- option utilty functions
local optGetter, optSetter
do
	local optionMap, getBar, callFunc
	-- maps option keys to function names
	optionMap = {
		buttons = "Buttons",
		enabled = "Enabled",
		grid = "Grid",
		macrotext = "HideMacroText",
		hotkey = "HideHotkey",
	}
	
	-- retrieves a valid bar object from the modules actionbars table
	function getBar(id)
		local bar = module.actionbars[tonumber(id)]
		assert(bar, ("Invalid bar id in options table. (%s)"):format(id))
		return bar
	end
	
	-- calls a function on the bar
	function callFunc(bar, type, option, ...)
		local func = type .. (optionMap[option] or option)
		assert(bar[func], ("Invalid get/set function %s in bar %s."):format(func, bar.id))
		return bar[func](bar, ...)
	end
	
	-- universal function to get a option
	function optGetter(info)
		local bar = getBar(info[2])
		local option = info[#info]
		return callFunc(bar, "Get", option)
	end
	
	-- universal function to set a option
	function optSetter(info, ...)
		local bar = getBar(info[2])
		local option = info[#info]
		return callFunc(bar, "Set", option, ...)
	end
end

-- returns the option table used for all action bars
-- creates it, if the first time called
-- the Universal Bar option table is merged into this, alot of stuff gets inherited.
function module:GetOptionsTable()
	return self:GetOptionsObject().table
end

function module:GetOptionsObject()
	if not self.baroptions then
		local obj = ButtonBar.GetOptionObject(self)
		
		local cat_general = {
			enabled ={
				order = 4,
				name = L["Enabled"],
				desc = L["Enable/Disable the bar."],
				type = "toggle",
				set = optSetter,
				get = optGetter,
			},
			grid = {
				order = 60,
				type = "toggle",
				name = L["Button Grid"],
				desc = L["Toggle the button grid."],
				set = optSetter,
				get = optGetter,
			},
			buttons = {
				order = 50,
				name = L["Buttons"],
				desc = L["Number of buttons."],
				type = "range",
				min = 1, max = 12, step = 1,
				set = optSetter,
				get = optGetter,
			},
			hidedesc = {
				order = 80,
				name = L["Button Look"],
				type = "header",
			},
			macrotext = {
				order = 81,
				type = "toggle",
				name = L["Hide Macro Text"],
				desc = L["Hide the Macro Text on the buttons of this bar."],
				set = optSetter,
				get = optGetter,
			},
			hotkey = {
				order = 82,
				type = "toggle",
				name = L["Hide Hotkey"],
				desc = L["Hide the Hotkey on the buttons of this bar."],
				set = optSetter,
				get = optGetter,
			},
		}
		obj:AddElementGroup("general", cat_general)
		
		local states = {
			type = "group",
			name = L["State Configuration"],
			cmdInline = true,
			order = 5,
			args = self:GetStateOptionsTable(),
		}
		obj:NewCategory("state", states)
		
		self.baroptions = obj
	end
	
	return self.baroptions
end

function module:CreateBarOption(id, options)
	if not self.options then return end
	
	if not options then 
		options = self:GetOptionsTable() 
	end
	
	id = tostring(id)
	if not self.options[id] then
		self.options[id] = {
			order = 10 + tonumber(id),
			type = "group",
			name = (L["Bar %s"]):format(id),
			desc = (L["Configure Bar %s"]):format(id),
			childGroups = "tab",
		}
	end
	self.options[id].args = options
	
	-- register options in the BT GUI
	Bartender4:RegisterBarOptions(id, self.options[id])
end
