﻿
local mod = klhtm
local me = { }
mod.table = me

me.mydata = { } -- personal threat table data
me.raiddata = { } -- raid's threat table data
me.raidthreatoffset = 0 -- difference between your total threat and your raid threat

me.raidclasses = { } -- list of classes by player name. e.g. { ["Kenco"] = "Warrior", }
me.raidupdatetimes = { } -- list of last update times by player, e.g. { ["Kenco"] = GetTime(), }

------------------------------------
--    Special Core.lua Methods    --
------------------------------------

me.onload = function()
	
	-- initialise me.mydata . This refers to static methods from me.string, so goes in our onload().
	me.mydata[mod.string.get("threatsource", "total")] = me.newdatastruct()
	
end

--[[
We have the list me.raiddata, key = name, value = threat. Then the list me.raidupdatetimes, key = value, name = time.
We want to remove people from raiddata who are not in the raid / party, and also to reset the threat of people who are
in the party, but who haven't updated for a while.
]]

me.lastonupdate = 0			-- value of GetTime()
me.updateinterval = 1.0		-- at most once every second
me.idlereset = 15.0			-- seconds before we reset someone's threat

me.onupdate = function()

	-- 1) check for update time
	local timenow = GetTime()
	if timenow > me.lastonupdate + me.updateinterval then
		me.lastonupdate = timenow
	else
		return
	end

	local x
	
	-- 2) Remove people who aren't in the raid group
	for x, _ in me.raiddata do
		
		if (x ~= mod.string.get("misc", "aggrogain")) and (mod.unit.isplayeringroup(x) == nil) then
			
			if mod.out.checktrace("info", me, "idleplayer") then
				mod.out.printtrace(string.format("Removing %s from the table, since he isn't in the raid group.", x))
			end
			
			me.raiddata[x] = nil
			me.raidupdatetimes[x] = nil
			
		end
	end

	-- 3) Reset inactive people
	for x, _ in me.raiddata do
		if me.raidupdatetimes[x] == nil then
			me.raidupdatetimes[x] = timenow

		elseif (timenow > me.raidupdatetimes[x] + me.idlereset) and (me.raiddata[x] ~= 0) then
			me.raiddata[x] = 0
			me.raidupdatetimes[x] = timenow
			
			if mod.out.checktrace("info", me, "idleplayer") then
				mod.out.printtrace(string.format("Resetting %s's threat, since he hasn't updated for a while.", x))
			end
		end
	end
		

end


-- to save lots of writing!
me.newdatastruct = function()
	
	return
	{
		["hits"] = 0,
		["damage"] = 0,
		["threat"] = 0,
		["rage"] = 0,
	}
	
end


-----------------------------------------------------

--[[ 
mod.table.getraidthreat()
Returns the value you would post to the raid group as your threat.
]]
me.getraidthreat = function()

	return me.mydata[mod.string.get("threatsource", "total")].threat + me.raidthreatoffset

end

--[[ 
mod.table.resetraidthreat()
Set your threat for the rest of the raid group to 0. Used for a complete threat wipe.
]]
me.resetraidthreat = function()
	
	me.raidthreatoffset = - me.mydata[mod.string.get("threatsource", "total")].threat
	
end

--[[ 
mod.table.updateplayerthreat(player, threat)
Updates a raid threat entry.
<player> is the name of the player whose threat is updated
<threat> is the new amount
TODO: add code to change aggrogain here, if player is master target???
]]
me.updateplayerthreat = function(player, threat)
	
	me.raiddata[player] = threat
	me.raidupdatetimes[player] = GetTime()

end


--[[ 
mod.table.redoraidclasses()
Checks the raid / party and finds the class of every player.
]]
me.redoraidclasses = function()
	
	local numraiders = GetNumRaidMembers()
	local class
	
	if (numraiders == 0) then
		-- we're not in a raid. check party
		
		local numparty = GetNumPartyMembers()
		
		for x = 1, numparty do
			_, class = UnitClass("party" .. x)
			me.raidclasses[UnitName("party" .. x)] = string.lower(class)
		end
		
		-- also do yourself
		me.raidclasses[UnitName("player")] = mod.my.class
		
	else -- we're in a raid
		
		local class
		local name
		
		for x = 1, numraiders do
			_, class = UnitClass("raid" .. x)
			me.raidclasses[UnitName("raid" .. x)] = string.lower(class)
		end
	end
end

--[[
mod.table.resetmytable()
Clears all the data in your personal threat table.
]]
me.resetmytable = function()
	
	-- reset raid offset
	me.raidthreatoffset = me.getraidthreat()
	
	-- clear table
	local key
	local value
	local key2
	
	for key, value in me.mydata do
		for key2 in value do
			value[key2] = 0
		end
	end
	
end

--[[ 
mod.table.resetraidtable()
Clears all the data in the raid table.
]]
me.clearraidtable = function()

	local key
	
	for key, _ in me.raiddata do
		me.raiddata[key] = nil;
	end
	
	me.raiddata[UnitName("player")] = 0

end
