--[[
	BagnonForever.lua
		Records inventory data about the current player
		
	BagnonForeverData has the following format, which was adapted from KC_Items
	BagnonForeverData = {
		Realm
			Character
				BagID = size,count,[link]
					ItemSlot = link,[count]
				Money = money
	}
--]]

--local globals
local currentPlayer = UnitName("player"); --the name of the current player that's logged on
local currentRealm = GetRealmName(); --what currentRealm we're on
local atBank; --is the current player at the bank or not

--[[ Utility Functions ]]--

--takes a hyperlink (what you see in chat) and converts it to a shortened item link.
--a shortened item link is either the item:w:x:y:z form without the 'item:' part, or just the item's ID (the 'w' part)
function BagnonForever_HyperlinkToShortLink(hyperLink)
	if(hyperLink) then
		local _, _, w, x, y, z = string.find(hyperLink, "item:(%d+):(%d+):(%d+):(%d+)");
		if(tonumber(x) == 0 and tonumber(y) == 0 and tonumber(z) == 0) then
			return w;
		else
			return w .. ":" .. x .. ":" .. y .. ":" .. z;
		end
	end
end

--[[  Storage Functions ]]--

--saves data about a specific item the current player has
local function SaveItemData(bagID, itemSlot)
	local texture, count = GetContainerItemInfo(bagID, itemSlot);
	local data;
	
	if(texture) then
		data = BagnonForever_HyperlinkToShortLink( GetContainerItemLink(bagID, itemSlot) );
		if(count > 1) then
			data = data .. "," .. count;
		end
	end
	
	BagnonForeverData[currentRealm][currentPlayer][bagID][itemSlot] = data;
end

--saves all the data about the current player's bag
local function SaveBagData(bagID)
	--don't save bank data unless you're at the bank
	if Bagnon_IsBankBag(bagID) and not atBank then
		return;
	end
	
	local size;
	if(bagID == KEYRING_CONTAINER) then
		size = GetKeyRingSize();
	else
		size = GetContainerNumSlots(bagID);
	end
	
	if(size > 0) then
		local link, count;
		
		if bagID > 0 then
			link = BagnonForever_HyperlinkToShortLink( GetInventoryItemLink("player", ContainerIDToInventoryID(bagID) ) );
		end
		
		count = GetInventoryItemCount("player", ContainerIDToInventoryID(bagID));
		
		--save bag size
		BagnonForeverData[currentRealm][currentPlayer][bagID] = {};
		BagnonForeverData[currentRealm][currentPlayer][bagID].s = size .. "," .. count .. ",";
		
		if link then
			BagnonForeverData[currentRealm][currentPlayer][bagID].s = BagnonForeverData[currentRealm][currentPlayer][bagID].s .. link;
		end

		--save all item info
		for index = 1, size, 1 do
			SaveItemData(bagID, index);
		end
	else
		BagnonForeverData[currentRealm][currentPlayer][bagID] = nil;
	end
end

local function SavePlayerMoney()
	BagnonForeverData[currentRealm][currentPlayer].g = GetMoney();
end

--save all bank data about the current player
local function SaveBankData()
	SaveBagData(-1);
	local bagID;
	for bagID = 5, 10, 1 do
		SaveBagData(bagID);
	end
end

--save all inventory data about the current player
local function SaveAllData()
	local i;
	--you know, this should probably be a constant
	for i = -2, 10, 1 do
		SaveBagData(i);
	end
	SavePlayerMoney();
end

--[[ Removal Functions ]]--

--removes all saved data about the given player
function BagnonForever_RemovePlayer(player, realm)
	if(BagnonForeverData[realm]) then
		BagnonForeverData[realm][player] = nil;
	end
end

--[[ Startup Functions ]]--

local function UpdateVersion()
	BagnonForeverData.version = BAGNON_FOREVER_VERSION;
	
	BagnonMsg(BAGNON_FOREVER_UPDATED);
end

--[[
	BagnonForever's settings are set to default under the following conditions
		No saved variables (duh)
		Versions that did not know about the wowVersion (should only be on new installs)
		Right after any WoW Patch
		
	I think that the itemcache is rebuilt whenever there's an update to the game, so saved data becomes corrupt.
--]]
local function LoadVariables()	
	if(not (BagnonForeverData and BagnonForeverData.wowVersion and BagnonForeverData.wowVersion == GetBuildInfo()) ) then
		BagnonForeverData = {
			version = BAGNON_FOREVER_VERSION,
			wowVersion = GetBuildInfo();
		};
	end
	
	--this handles upgrading from 6.7.19 or earlier
	if(BagnonDB and not (BagnonDB.GetPlayers or BagnonDB.GetPlayerList)) then
		message("BagnonForever:  Updating from an old version.  Saved data will be available on your next login.");
		BagnonDB = nil;
	end
	
	if(not BagnonForeverData[currentRealm]) then
		BagnonForeverData[currentRealm] = {};
	end
	
	if(not BagnonForeverData[currentRealm][UnitName("player")]) then
		BagnonForeverData[currentRealm][UnitName("player")] = {};
		SaveAllData();
	end
	
	if(BagnonForeverData.version ~= BAGNON_FOREVER_VERSION) then
		UpdateVersion();
	end
end

--Event handler creation
CreateFrame("Frame", "BagnonForever");

BagnonForever:RegisterEvent("BAG_UPDATE");
BagnonForever:RegisterEvent("PLAYER_LOGIN");
BagnonForever:RegisterEvent("BANKFRAME_CLOSED");
BagnonForever:RegisterEvent("BANKFRAME_OPENED");
BagnonForever:RegisterEvent("PLAYERBANKSLOTS_CHANGED");
BagnonForever:RegisterEvent("PLAYER_MONEY");

BagnonForever:SetScript("OnEvent", function()
	if(event == "BAG_UPDATE") then
		SaveBagData(arg1);
	elseif(event == "PLAYERBANKSLOTS_CHANGED") then
		SaveBagData(-1);
	elseif(event == "BANKFRAME_CLOSED") then
		atBank = nil;
		SaveBankData();
	elseif(event == "BANKFRAME_OPENED") then
		atBank = 1;
		SaveBankData();
	elseif(event == "PLAYER_MONEY") then
		SavePlayerMoney();
	elseif(event == "PLAYER_LOGIN") then
		LoadVariables();
		SavePlayerMoney();
	end
end);