Quantcast
local addonname, addon = ...
local L = addon.L

local options = {}
local UpdateIconLists

local function getprofile(info)
	return addon.db.profile[info[2]]
end

local function setprofile(info, val)
	addon.db.profile[info[2]] = val
end

options.general = {
	type = 'group',
	name = addonname,

	args = {
		general = {
			name = L['General'],
			type = 'group',
			order = 1,
			inline = true,

			args = {
				desc = {
					name = function(info)
						for k,v in pairs(addon.db.profile.enabled_in) do
							if v == true then
								return L['Kungaloosh will be automatically enabled when getting assigned as tank but can also be manually enabled with the slash command |cff00ff00/kl|r.']
							end
						end

						return L['Kungaloosh must be manually enabled with the slash command |cff00ff00/kl|r.']
					end,
					type = 'description',
					order = 1
				},

				sep = { order = 2, type = 'header', name = '' },

				enabled_in = {
					name = L['Enable when assigned as tank in a ...'],
					desc = L['Enables the addon automatically if you\'re assigned as tank in a dungeon or raid'],
					type = 'multiselect',
					order = 3,
					width = 'half',

					values = { dungeon = L['Dungeon'], raid = L['Raid'] },
					get = function(info, key) return addon.db.profile.enabled_in[key] end,
					set = function(info, key, val) addon.db.profile.enabled_in[key] = val end
				},
			},
		},

		threat = {
			name = L['Threat'],
			type = 'group',
			order = 2,
			inline = true,

			args = {
				desc = {
					name = function(info)
						return L['Kungaloosh will place a raid target icon on the target when you have done |cffff0000%d|r or more threat to it.']:format(addon:GetMinThreat())
					end,
					type = 'description',
					order = 1
				},

				sep = { order = 2, type = 'header', name = '' },

				dynamic_minthreat = {
					name = L['Dynamic threat value'],
					desc = L['Tries to guess a good threat value based on your level'],
					type = 'toggle',
					order = 3,
					set = setprofile,
					get = getprofile
				},

				minthreat = {
					name = L['Manual threat value'],
					desc = L['Threat value to have before placing a raid target icon'],
					type = 'input',
					order = 4,

					set = function(info, val) setprofile(info, tonumber(val)) end,
					get = function(info) return tostring(getprofile(info)) end,

					disabled = function(info) return addon.db.profile.dynamic_minthreat end,
					validate = function(info, value) if tonumber(value) then return true else return L['Invalid number'] end end
				}
			}
		},


		icons = {
			name = L['Icons'],
			type = 'group',
			order = 3,
			inline = true,

			args = {
				desc = {
					name = L['Here you can customize what icons to use and in what order they will be placed. Click on the icon to either add or remove it.'],
					type = 'description',
					order = 1
				},

				sep = { order = 2, type = 'header', name = '' },

				enabled = {
					name = L['Enabled'],
					type = 'group',
					order = 3,

					args = {}
				},
					disabled = {
					name = L['Available'],
					type = 'group',
					order = 4,

					args = {}
				}
			},
		},
	}
}

local GetRaidTargetCoords, CreateIconOptions, IconExecuteFunc, UpdateIconLists
local iconopts = {}

function GetRaidTargetCoords(i)
	local index = i - 1
	local inc = RAID_TARGET_ICON_DIMENSION / RAID_TARGET_TEXTURE_DIMENSION
	local left = mod(index, RAID_TARGET_TEXTURE_COLUMNS) * inc
	local right = left + inc
	local top = floor(index / RAID_TARGET_TEXTURE_ROWS) * inc
	local bottom = top + inc

	return left, right, top, bottom
end

function IconExecuteFunc(info)
	local state, icon = info[2], tonumber(info[3])

	if state == 'enabled' then
		for i,v in ipairs(addon.db.profile.raid_icons) do
			if v == icon then
				table.remove(addon.db.profile.raid_icons, i)
			end
		end
	else
		table.insert(addon.db.profile.raid_icons, icon)
	end

	UpdateIconLists()
end

function CreateIconOptions(icon)
	return {
		type = 'execute',
		name = _G['RAID_TARGET_'..icon],
		image = [[Interface\TargetingFrame\UI-RaidTargetingIcons]],
		imageCoords = { GetRaidTargetCoords(icon) },
		imageWidth = 16,
		imageHeight = 16,
		width = 'half',
		func = IconExecuteFunc
	}
end

function UpdateIconLists()
	local function IsEnabled(icon)
		for i,v in ipairs(addon.db.profile.raid_icons) do
			if v == icon then
				return true
			end
		end
	end

	table.wipe(options.general.args.icons.args.enabled.args)
	table.wipe(options.general.args.icons.args.disabled.args)

	for i, icon in ipairs(addon.db.profile.raid_icons) do
		local icontbl = iconopts[icon]
		icontbl.order = i

		options.general.args.icons.args.enabled.args[tostring(icon)] = icontbl
	end

	for i = 1,8 do
		if not IsEnabled(i) then
			local icontbl = iconopts[i]
			icontbl.order = i

			options.general.args.icons.args.disabled.args[tostring(i)] = icontbl
		end
	end

	LibStub('AceConfigRegistry-3.0'):NotifyChange(addonname)
end

function addon:CreateConfig()
	options.profiles = LibStub('AceDBOptions-3.0'):GetOptionsTable(self.db)

	LibStub('AceConfig-3.0'):RegisterOptionsTable('Kungaloosh-General', options.general)
	LibStub('AceConfig-3.0'):RegisterOptionsTable('Kungaloosh-Profiles', options.profiles)

	LibStub('AceConfigDialog-3.0'):AddToBlizOptions('Kungaloosh-General', addonname)
	LibStub('AceConfigDialog-3.0'):AddToBlizOptions('Kungaloosh-Profiles', 'Profiles', addonname)

	LibStub('tekKonfig-AboutPanel').new(addonname, addonname)


	for i = 1,8 do
		iconopts[i] = CreateIconOptions(i)
	end

	self.db.RegisterCallback(self, 'OnNewProfile', UpdateIconLists)
	self.db.RegisterCallback(self, 'OnProfileChanged', UpdateIconLists)
	self.db.RegisterCallback(self, 'OnProfileCopied', UpdateIconLists)
	self.db.RegisterCallback(self, 'OnProfileDeleted', UpdateIconLists)
	self.db.RegisterCallback(self, 'OnProfileReset', UpdateIconLists)

	UpdateIconLists()
end