--[[
	Events.lua
		The main event handler for Bagnon and Banknon.
		It controls when the frames update, and when and when they are not shown.
		
		The UI by default partially supports showing/hiding at the mailbox, and fully supports the inventory frame showing/hiding at a vendor.
		
		I've extended the behavior in the following ways:
			If a frame was previously shown by a user, it will not automatically close.
			The events of showing the bank, tradeskill, auction, and trading can also be set to open the inventory or bank windows.
--]]

bgn_atBank = nil; --a flag for if the player is at the bank or not

function BagnonEvents_OnEvent()
	--[[ 
		Events For Updating Items
	--]]
	if event == "BAG_UPDATE" or event == "BAG_UPDATE_COOLDOWN" then
		if Bagnon and Bagnon:IsVisible() and Bagnon_FrameHasBag("Bagnon", arg1) then
			BagnonFrame_Update(Bagnon, arg1);		
		elseif Banknon and Banknon:IsVisible() and Bagnon_FrameHasBag("Banknon", arg1) then
			BagnonFrame_Update(Banknon, arg1);
		end
	elseif event == "PLAYERBANKSLOTS_CHANGED" then
		if Banknon and Banknon:IsVisible() and Bagnon_FrameHasBag("Banknon", -1) then
			BagnonFrame_Update(Banknon, -1);
		end
	elseif event == "ITEM_LOCK_CHANGED" then
		if Bagnon and Bagnon:IsVisible() then
			BagnonFrame_UpdateLock(Bagnon);		
		end
		if Banknon and Banknon:IsVisible() then
			BagnonFrame_UpdateLock(Banknon);
		end
	--the keyring's size changes based on the player's level
	elseif event == "PLAYER_LEVEL_UP" then
		if Bagnon and Bagnon:IsVisible() and Bagnon_FrameHasBag("Bagnon", KEYRING_CONTAINER) then
			BagnonFrame_Generate(Bagnon);
		end
	--[[ 
		Automatic Frame Opening/Closing Events 
	--]]
	elseif event == "BANKFRAME_OPENED" then
		bgn_atBank = 1;
		if BagnonSets.showBagsAtBank then
			BagnonFrame_Open("Bagnon", 1);
		end
		
		if BagnonSets.showBankAtBank and Bagnon_IsAddOnEnabled("Banknon") then
			BagnonFrame_Open("Banknon", 1);
		else
			BagnonEvents_ShowBlizBank();
		end
	elseif event == "BANKFRAME_CLOSED" then
		bgn_atBank = nil;
		if BagnonSets.showBagsAtBank then
			BagnonFrame_Close("Bagnon", 1);
		end		
		if BagnonSets.showBankAtBank then
			BagnonFrame_Close("Banknon", 1);
		end
	elseif event == "TRADE_SHOW" then
		if BagnonSets.showBagsAtTrade then
			BagnonFrame_Open("Bagnon", 1);
		end		
		if BagnonSets.showBankAtTrade then
			BagnonFrame_Open("Banknon", 1);
		end
	elseif event == "TRADE_CLOSED" then
		if BagnonSets.showBagsAtTrade then
			BagnonFrame_Close("Bagnon", 1);
		end		
		if BagnonSets.showBankAtTrade then
			BagnonFrame_Close("Banknon", 1);
		end
	elseif event == "TRADE_SKILL_SHOW" then
		if BagnonSets.showBagsAtCraft then
			BagnonFrame_Open("Bagnon", 1);
		end		
		if BagnonSets.showBankAtCraft then
			BagnonFrame_Open("Banknon", 1);
		end
	elseif event == "TRADE_SKILL_CLOSE" then
		if BagnonSets.showBagsAtCraft then
			BagnonFrame_Close("Bagnon", 1);
		end		
		if BagnonSets.showBankAtCraft then
			BagnonFrame_Close("Banknon", 1);
		end
	elseif event == "AUCTION_HOUSE_SHOW" then
		if BagnonSets.showBagsAtAH then
			BagnonFrame_Open("Bagnon", 1);
		end		
		if BagnonSets.showBankAtAH then
			BagnonFrame_Open("Banknon", 1);
		end
	elseif event == "AUCTION_HOUSE_CLOSED" then
		if BagnonSets.showBagsAtAH then
			BagnonFrame_Close("Bagnon", 1);
		end		
		if BagnonSets.showBankAtAH then
			BagnonFrame_Close("Banknon", 1);
		end
	elseif event == "MAIL_SHOW" then
		if BagnonSets.showBankAtMail then
			BagnonFrame_Open("Banknon", 1);
		end
	elseif event == "MAIL_CLOSED" then
		BagnonFrame_Close("Bagnon", 1);
		
		if BagnonSets.showBankAtMail then
			BagnonFrame_Close("Banknon", 1);
		end
	elseif event == "MERCHANT_SHOW" then
		if BagnonSets.showBankAtVendor then
			BagnonFrame_Open("Banknon", 1);
		end
	elseif event == "MERCHANT_CLOSED" then
		if BagnonSets.showBankAtVendor then
			BagnonFrame_Close("Banknon", 1);
		end
	--[[ Loading Event ]]--
	elseif event == "ADDON_LOADED" and arg1 == "Bagnon_Core" then
		BagnonEvents:UnregisterEvent("ADDON_LOADED");		
		BagnonEvents_Load(this);
	end
end

function BagnonEvents_Load(eventFrame)
	BankFrame:UnregisterEvent("BANKFRAME_OPENED");
	
	--disable the ItemOnUpdate function for those using KCItems, since it causes a pretty bad memory leak
	if KC_Items then
		BagnonItem_OnUpdate = function() return; end;
	end
	
	BagnonEvents_LoadVariables();
	BagnonEvents_ObtainLocalizedNames();
	Infield.AddRescaleAction(BagnonEvents_RescaleAll);
	
	eventFrame:RegisterEvent("BAG_UPDATE");
	eventFrame:RegisterEvent("PLAYERBANKSLOTS_CHANGED");
	eventFrame:RegisterEvent("ITEM_LOCK_CHANGED");
	eventFrame:RegisterEvent("BAG_UPDATE_COOLDOWN");
	eventFrame:RegisterEvent("PLAYER_LEVEL_UP");
	
	eventFrame:RegisterEvent("BANKFRAME_OPENED");
	eventFrame:RegisterEvent("BANKFRAME_CLOSED");
	eventFrame:RegisterEvent("TRADE_SHOW");
	eventFrame:RegisterEvent("TRADE_CLOSED");
	eventFrame:RegisterEvent("TRADE_SKILL_SHOW");
	eventFrame:RegisterEvent("TRADE_SKILL_CLOSE");
	eventFrame:RegisterEvent("AUCTION_HOUSE_SHOW");
	eventFrame:RegisterEvent("AUCTION_HOUSE_CLOSED");
	eventFrame:RegisterEvent("MAIL_SHOW");
	eventFrame:RegisterEvent("MAIL_CLOSED");
	eventFrame:RegisterEvent("MERCHANT_SHOW");
	eventFrame:RegisterEvent("MERCHANT_CLOSED");
end

function BagnonEvents_LoadVariables()
	if not BagnonSets then	
		BagnonSets = {
			showBagsAtBank = 1,
			showBagsAtAH = 1,
			showBankAtBank = 1,
			showTooltips = 1,
			qualityBorders = 1,
			showForeverTooltips = 1,
			version = BAGNON_VERSION,
		};
		BagnonMsg(BAGNON_INITIALIZED);
	elseif BagnonSets.version ~= BAGNON_VERSION then
		BagnonSets.showForeverTooltips = 1;
		BagnonSets.version = BAGNON_VERSION;
		BagnonMsg(BAGNON_UPDATED);
	end
end

local function BagnonHasInfo()
	return (GetLocale() == "enUS" or 
			GetLocale() == "deDE" or 
			GetLocale() == "frFR" or 
			GetLocale() == "zhCN" or
			GetLocale() == "zhTW" or 
			BagnonSets.noDebug);
end

--try and get localized names, so that its possible to do special bag coloring
function BagnonEvents_ObtainLocalizedNames()
	if not BagnonHasInfo() then
		BagnonMsg("Obtaining localized data.  Please report the following to where you downloaded Bagnon from.");
		BagnonMsg(GetLocale());
	end
	
	--backpack
	local name, _, _, _, iType, subType = GetItemInfo(4500); 		
	if name then
		if not BagnonHasInfo() then
			BagnonMsg("Backpack:  " .. (iType or "null") .. ", " .. (subType or "null"));
		end
		if iType then
			BAGNON_ITEMTYPE_CONTAINER = iType;
			BAGNON_SUBTYPE_BAG = subType;
		end
	end

	--ammo	
	name, _, _, _, iType, subType = GetItemInfo(8218); 
	if name then
		if not BagnonHasInfo() then
			BagnonMsg("Ammo:  " .. (iType or "null") .. ", " .. (subType or "null"));
		end
		if iType then
			BAGNON_ITEMTYPE_QUIVER = iType;
		end
	end

	--soul pouch
	name, _, _, _, iType, subType = GetItemInfo(21340); 
	if name then
		if not BagnonHasInfo() then
			BagnonMsg("Soul Bag:  " .. (iType or "null") .. ", " .. (subType or "null"));
		end
		if subType then
			BAGNON_SUBTYPE_SOULBAG = subType;
		end
	end
end

function BagnonEvents_RescaleAll()
	if Bagnon then
		BagnonFrame_Reposition(Bagnon);
	end
	if Banknon then
		BagnonFrame_Reposition(Banknon);
	end
end

--[[
	Taken from Blizzard's code
	Shows the normal bank frame
--]]

function BagnonEvents_ShowBlizBank()
	BankFrameTitleText:SetText(UnitName("npc"));
	SetPortraitTexture(BankPortraitTexture,"npc");
	ShowUIPanel(BankFrame);
	
	if not BankFrame:IsVisible() then
		CloseBankFrame();
	end
	UpdateBagSlotStatus();
end

--[[ Create the Event Handler Frame ]]--
CreateFrame("Frame", "BagnonEvents")
BagnonEvents:RegisterEvent("ADDON_LOADED");
BagnonEvents:SetScript("OnEvent", BagnonEvents_OnEvent);
BagnonEvents:Hide();