Quantcast
local addon, ns = ...
local db, events, F, L = ns:Locals()
local open_rolls = {}
local pending_loot = {}
local raiders = {}
local historyIDs = {}

events:RegisterEvent("OPEN_MASTER_LOOT_LIST")

function events:RollAndAssign(itemName, itemLink)
	events:RegisterEvent("LOOT_ROLLS_COMPLETE")
	events:RegisterEvent("LOOT_HISTORY_FULL_UPDATE")

	DoMasterLootRoll(F:GetLootSlot(itemLink))
end

function events:LOOT_ROLLS_COMPLETE(event, ...)
	F:ProcessOpenRolls(open_rolls)
end

function events:LOOT_HISTORY_FULL_UPDATE(...)
	local highID, highLink, rollID, itemLink

	table.wipe(historyIDs)

	for i = 1, C_LootHistory.GetNumItems() do
		rollID, itemLink = C_LootHistory.GetItem(i)
		highID = not highID and rollID or ((highID and rollID > highID) and rollID or highID)
		highLink = rollID == highID and itemLink or highLink

		historyIDs[rollID] = true
	end

	open_rolls[highID] = highLink

	for k, v in pairs(open_rolls) do
		open_rolls[k] = historyIDs[k] and v or nil
	end

	events:UnregisterEvent("LOOT_HISTORY_FULL_UPDATE")
end

function events:AssignToRandom(itemName, itemLink)
	F:AssignLoot("random", itemLink, nil, open_rolls)
end

function events:LootItem(_, itemLink)
	F:AssignLoot("loot", itemLink, GetUnitName("player"), open_rolls)
end

function events:AssigntoReserver(itemName, itemLink)
	F:AssignLoot("loot", itemLink, select(2, events:GetReserver(itemName)), open_rolls)
end

function events:GetReserver(itemName)
	if db.reserves[itemName] then
		local name, server = db.reserves[itemName]:match("(.+)%-(.+)")
		name = name or db.reserves[itemName]
		local reserver = server == GetRealmName() and name or db.reserves[itemName]

		return name, reserver
	else
		return L.Reserver
	end
end

function events:GetDisabled(itemName)
	local reserver = select(2, events:GetReserver(itemName)) or events:GetReserver(itemName)

	if reserver == L.Reserver then
		return true
	else
		for i = 1, MAX_RAID_MEMBERS do
			local roster = GetRaidRosterInfo(i)
			if roster == reserver or roster == reserver then
				return false
			end
		end
		return true
	end
end

local info
local menu_items = {
	-- {isTitle, text, fontObject, notCheckable, func}
	{true, MASTER_LOOTER, GameFontNormalLeft, true, false},
	{false, ASSIGN_LOOT, false, true, MasterLooterFrame_Show},
	{false, REQUEST_ROLL, false, true, function() DoMasterLootRoll(LootFrame.selectedSlot) end},
	{false, false, false, true, false, true},
	{true, L.Addon, GameFontNormalLeft, true, false},
	{false, L.RollAndAssign, false, true, events.RollAndAssign},
	{false, L.AssignToRandom, false, true, events.AssignToRandom},
	{false, L.LootItem, false, true, events.LootItem}
}

function events:OPEN_MASTER_LOOT_LIST(...)
	CloseDropDownMenus()

	UIDropDownMenu_Initialize(GroupLootDropDown, function(self, level, menuList)
		for k, v in pairs(menu_items) do
			info = UIDropDownMenu_CreateInfo()
			info.isTitle = v[1]
			info.text = v[2]
			info.fontObject = v[3]
			info.notCheckable = v[4]
			info.func = v[5]
			info.disabled = false
			info.arg1 = select(2, GetLootSlotInfo(LootFrame.selectedSlot))
			info.arg2 = GetLootSlotLink(LootFrame.selectedSlot)
			UIDropDownMenu_AddButton(info)
		end

		info = UIDropDownMenu_CreateInfo()
		info.isTitle = false
		info.text = string.format(L.AssignToReserver, events:GetReserver(LootFrame.selectedItemName))
		info.fontObject = false
		info.notCheckable = true
		info.func = events.AssigntoReserver
		info.disabled = events:GetDisabled(LootFrame.selectedItemName)
		info.arg1 = select(2, GetLootSlotInfo(LootFrame.selectedSlot))
		info.arg2 = GetLootSlotLink(LootFrame.selectedSlot)
		UIDropDownMenu_AddButton(info)
	end)

	ToggleDropDownMenu(1, nil, GroupLootDropDown, LootFrame.selectedLootButton, 0, 0)
end

LootFrame:HookScript("OnShow", function()
	F:ProcessOpenRolls(open_rolls)
end)

LootFrame:HookScript("OnHide", function()
	CloseDropDownMenus()
end)