Quantcast

KarmaAvEnKHistory = { Alliance = {}, Horde = {} };

local	KarmaObj = KarmaAvEnK;
KarmaObj.History = {};
local	KOH = KarmaObj.Helpers;
local	HistoryObj = KarmaObj.History;

local	KARMA_DB_L4_RRFF = {
			MEMBERBUCKETS = "MEMBERBUCKETS",

			HISTORY_MOVED = "HIST_MOVED",
			HISTORY_SEEN = "HIST_SEEN",
		};

local	KARMA_DB_L5_RRFFM = {
			LASTSEEN = "LASTSEEN",
		};

local		KARMA_DB_L5_RRFFM_TIMESTAMP = "TIMESTAMP";
local		KARMA_DB_L5_RRFFM_TIMESTAMP_SUCCESS = "SUCCESS";

local		KARMA_DB_L5_RRFFM_JOINEDLAST_TIME = "JOINEDLAST";

function	HistoryObj.Update(sRealmOnly, bServerValid)
	local	oRealms, iIxR, sRealm = KarmaObj.DB.ServerListGet(true);
	if (type(sRealmOnly) == "string") then
		if (not bServerValid and not KarmaObj.DB.ServerExists(sRealmOnly)) then
			KarmaChatDefault("Server <" .. sRealmOnly .. "> does not have any data stored yet.");
			return
		end

		oRealms = { sRealmOnly };
	end

	for iIxR, sRealm in pairs(oRealms) do
		local	sFaction = UnitFactionGroup("player");
		KOH.TableInit(KarmaAvEnKHistory[sFaction], sRealm);
		local	oHistory = KarmaAvEnKHistory[sFaction][sRealm];

		local	oRealm = KarmaObj.DB.FactionServerGet(sRealm);
		local	oBuckets = oRealm[KARMA_DB_L4_RRFF.MEMBERBUCKETS];

		KarmaChatSecondaryFallbackDefault("Checking server " .. sRealm .. "...");


		-- check for stuff to move back
		KOH.TableInit(oRealm, KARMA_DB_L4_RRFF.HISTORY_SEEN);
		local	oSeen = oRealm[KARMA_DB_L4_RRFF.HISTORY_SEEN];

		local	iCntMerged = 0;
		local	iCntMoved = 0;

		local	sMember, iWhen;
		for sMember, iWhen in pairs(oSeen) do
			if (type(oHistory[sMember]) == "table") then
				local	sBucket = KarmaObj.NameToBucket(sMember);
				local	oMember = oBuckets[sBucket][sMember];
				if (oMember) then
					iCntMerged = iCntMerged + 1;
					KarmaObj.DB.MergeChar(oMember, oHistory[sMember])
				else
					iCntMoved = iCntMoved + 1;
					oBuckets[sBucket][sMember] = oHistory[sMember];
				end

				oBuckets[sBucket][sMember][KARMA_DB_L5_RRFFM.LASTSEEN] = iWhen;

				oHistory[sMember] = nil;
			end
		end

		table.wipe(oSeen);

		-- TEMP
		local	oMove, sMember, oMember = {};
		for sMember, oMember in pairs(oHistory) do
			local	iAltID = Karma_MemberObject_GetAltID(oMember) or -1;
			if (strfind(sMember, ":", 1, true) or (iAltID ~= -1)) then
				tinsert(oMove, sMember);
			end
		end
		local	iIx, sMember;
		for iIx, sMember in pairs(oMove) do
			local	sBucket = KarmaObj.NameToBucket(sMember);
			oBuckets[sBucket][sMember] = oHistory[sMember];
			oHistory[sMember] = nil;
			iCntMoved = iCntMoved + 1;
		end
		-- TEMP

		if (iCntMerged + iCntMoved > 0) then
			KarmaChatSecondaryFallbackDefault("Server " .. sRealm .. ": Restored " .. (iCntMerged + iCntMoved) .. " entries (merged " .. iCntMerged .. ", moved " .. iCntMoved .. ")");
		end


		-- move out old data
		local	iCntMoved = 0;

		local	iNow, sBucket, oBucket = time();
		for sBucket, oBucket in pairs(oBuckets) do
			local	oMove, sMember, oMember = {};
			for sMember, oMember in pairs(oBucket) do
				if (not strfind(sMember, ":", 1, true)) then
					local	sNotes = Karma_MemberObject_GetNotes(oMember) or "";
					local	iAltID = Karma_MemberObject_GetAltID(oMember) or -1;
					if ((sNotes == "") and (iAltID == -1)) then
						local	iTime = 0;
						local	oField = oMember[KARMA_DB_L5_RRFFM_TIMESTAMP];
						if (oField and oField[KARMA_DB_L5_RRFFM_TIMESTAMP_SUCCESS]) then
							iTime = math.max(iTime, oField[KARMA_DB_L5_RRFFM_TIMESTAMP_SUCCESS]);
						end
						local	oField = oMember[KARMA_DB_L5_RRFFM.LASTSEEN];
						if (oField) then
							iTime = math.max(iTime, oField);
						end
						local	oField = oMember[KARMA_DB_L5_RRFFM_JOINEDLAST_TIME];
						if (oField) then
							iTime = math.max(iTime, oField);
						end

						if (iNow - iTime > 86400 * 365.25) then
							tinsert(oMove, sMember);
						end
					end
				end
			end

			local	iIx;
			for iIx, sMember in pairs(oMove) do
				oHistory[sMember] = oBucket[sMember];
				oBucket[sMember] = nil;
			end

			iCntMoved = iCntMoved + #oMove;
		end

		if (iCntMoved > 0) then
			KarmaChatSecondaryFallbackDefault("Server " .. sRealm .. ": Moved " .. iCntMoved .. " entries out into historic database.");
		end


		-- update the moved list
		local	oMoved, sMember, oMember = {};
		for sMember, oMember in pairs(oHistory) do
			oMoved[sMember] = oRealm[KARMA_DB_L4_RRFF.HISTORY_MOVED][sMember] or iNow;
		end

		oRealm[KARMA_DB_L4_RRFF.HISTORY_MOVED] = oMoved;
	end
end