--[[
	Bags.lua
		Functions used by Bagnon Bags
--]]

--[[ OnX Functions ]]--

function BagnonBag_OnLoad()
	this:RegisterForDrag("LeftButton");
	this:RegisterForClicks("LeftButtonUp", "RightButtonUp");
	
	this:RegisterEvent("BAG_UPDATE");
	this:RegisterEvent("ITEM_LOCK_CHANGED");
	this:RegisterEvent("CURSOR_UPDATE");
	this:RegisterEvent("BAG_UPDATE_COOLDOWN");
	
	if( Bagnon_IsBankBag(this:GetID() ) ) then
		this:RegisterEvent("PLAYERBANKBAGSLOTS_CHANGED");
	end
end

function BagnonBag_OnEvent()
	if( not this:IsVisible() or Bagnon_IsCachedFrame(this:GetParent():GetParent()) ) then
		return;
	end

	if ( event == "BAG_UPDATE" ) then
		if( arg1 == this:GetID() ) then
			BagnonBag_Update(this);
			BagnonBag_UpdateFrameSize(this:GetParent());
		end
	elseif (event == "ITEM_LOCK_CHANGED") then
		BagnonBag_UpdateLock(this);
	elseif (event == "BAG_UPDATE_COOLDOWN") then
		if( arg1 == this:GetID() ) then
			BagnonBag_UpdateCooldown(this);
		end
	elseif (event == "CURSOR_UPDATE") then
		BagnonBag_UpdateCursor(this);
	elseif ( event == "PLAYERBANKBAGSLOTS_CHANGED") then
		BagnonBag_Update(this);
		BagnonBag_UpdateFrameSize(this:GetParent());
	end
end

function BagnonBag_OnShow()
	BagnonBag_UpdateTexture(this:GetParent():GetParent(), this:GetID());
end

function BagnonBag_OnClick()
	if ( Bagnon_IsCachedBag(this:GetParent():GetParent().player, this:GetID() ) ) then
		return;
	end

	if(not IsShiftKeyDown() ) then
		--damn you blizzard for making the keyring specific code!
		if( this:GetID() == KEYRING_CONTAINER ) then
			PutKeyInKeyRing();
		else
			PutItemInBag(ContainerIDToInventoryID(this:GetID()));
		end
	else
		BagnonFrame_ToggleBag(this:GetParent():GetParent(), this:GetID());
	end
end

function BagnonBag_OnDrag()
	if (Bagnon_IsCachedBag(this:GetParent():GetParent().player, this:GetID()) )  then 
		return;
	end

	PickupBagFromSlot( ContainerIDToInventoryID(this:GetID()) );
	PlaySound("BAGMENUBUTTONPRESS");
end

--tooltip functions
function BagnonBag_OnEnter()
	local frame = this:GetParent():GetParent();
	
	BagnonFrame_HighlightSlots(frame, this:GetID());
	
	if( this:GetLeft() < ( UIParent:GetRight() / 2) ) then
		GameTooltip:SetOwner(this, "ANCHOR_RIGHT");
	else
		GameTooltip:SetOwner(this, "ANCHOR_LEFT");
	end
	
	--mainmenubag specific code
	if( this:GetID() == 0 ) then
		GameTooltip:SetText(TEXT(BACKPACK_TOOLTIP), 1.0, 1.0, 1.0);
	--keyring specific code...again
	elseif ( this:GetID() == KEYRING_CONTAINER ) then
		GameTooltip:SetText(KEYRING, HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b);
	--cached bags
	elseif( Bagnon_IsCachedBag(frame.player, this:GetID()) ) then
		local _, link = BagnonDB.GetBagData(frame.player, this:GetID());
		
		if(link) then
			GameTooltip:SetHyperlink( link );
			GameTooltip:Show();
		else
			GameTooltip:SetText(TEXT(EQUIP_CONTAINER), 1.0, 1.0, 1.0);
		end
	elseif ( not GameTooltip:SetInventoryItem("player", ContainerIDToInventoryID(this:GetID()) ) ) then
		GameTooltip:SetText(TEXT(EQUIP_CONTAINER), 1.0, 1.0, 1.0);
	end
	
	if(not Bagnon_IsCachedBag(frame.player, this:GetID()) ) then
		--add the shift click to hide/show tooltip
		if(BagnonSets.showTooltips) then
			if( Bagnon_FrameHasBag(frame:GetName(), this:GetID()) ) then
				GameTooltip:AddLine(BAGNON_BAGS_HIDE);
			else
				GameTooltip:AddLine(BAGNON_BAGS_SHOW);
			end
		end
	end
	
	GameTooltip:Show();
end

function BagnonBag_OnLeave()
	BagnonFrame_UnhighlightAll(this:GetParent():GetParent());
	GameTooltip:Hide();
end

--[[ Update Functions ]]--

function BagnonBag_Update(bag)
	local invID = ContainerIDToInventoryID(bag:GetID());
	
	local textureName = GetInventoryItemTexture("player", invID);
	if ( textureName ) then
		SetItemButtonTexture(bag, textureName);
		BagnonBag_SetCount(bag, GetInventoryItemCount("player", invID));
		
		if ( not IsInventoryItemLocked(invID) ) then 
			SetItemButtonTextureVertexColor(bag, 1.0, 1.0, 1.0);
			SetItemButtonNormalTextureVertexColor(bag, 1.0, 1.0, 1.0);
		end
		bag.hasItem = 1;
	else
		SetItemButtonTexture(bag, nil);
		BagnonBag_SetCount(bag, 0);
		SetItemButtonTextureVertexColor(bag, 1.0, 1.0, 1.0);
		SetItemButtonNormalTextureVertexColor(bag, 1.0, 1.0, 1.0);
		getglobal(bag:GetName().."Cooldown"):Hide();
		bag.hasItem = nil;
	end
	if ( GameTooltip:IsOwned(bag) ) then
		if ( textureName  ) then
			BagnonBag_OnEnter(bag);
		else
			GameTooltip:Hide();
			ResetCursor();
		end
	end
	BagnonBag_UpdateCooldown(bag);
	BagnonBag_UpdateLock(bag);

	-- Update repair all button status
	if ( MerchantRepairAllIcon ) then
		local repairAllCost, canRepair = GetRepairAllCost();
		if ( canRepair ) then
			SetDesaturation(MerchantRepairAllIcon, nil);
			MerchantRepairAllButton:Enable();
		else
			SetDesaturation(MerchantRepairAllIcon, 1);
			MerchantRepairAllButton:Disable();
		end	
	end
end

function BagnonBag_UpdateCooldown(bag)
	local cooldown = getglobal(bag:GetName().."Cooldown");
	
	local start, duration, enable = GetInventoryItemCooldown("player", ContainerIDToInventoryID(bag:GetID()));
	CooldownFrame_SetTimer(cooldown, start, duration, enable);
end

function BagnonBag_UpdateLock(bag)
	if ( IsInventoryItemLocked( ContainerIDToInventoryID(bag:GetID()) ) ) then
		SetItemButtonDesaturated(bag, 1, 0.5, 0.5, 0.5);
	else 
		SetItemButtonDesaturated(bag, nil);
	end
end

function BagnonBag_UpdateCursor(bag)
	if ( CursorCanGoInSlot( ContainerIDToInventoryID( bag:GetID() ) ) ) then
		bag:LockHighlight();
	else
		bag:UnlockHighlight();
	end
end


--[[
	Update the texture and count of the bag
		Used mainly for cached bags
--]]
function BagnonBag_UpdateTexture(frame, bagID)
	local bag = getglobal(frame:GetName() .. "Bags" .. bagID);
	if(not bag or bag:GetID() <= 0) then return; end
	
	if( Bagnon_IsCachedBag(frame.player, bagID) ) then
		local _, link, count = BagnonDB.GetBagData(frame.player, bagID);
		if(link) then
			local _, _, _, _, _, _, _, _, texture = GetItemInfo(link);
			SetItemButtonTexture(bag, texture);
		else
			SetItemButtonTexture(bag, nil);
		end
		if(count) then
			BagnonBag_SetCount(bag, count);
		end
	else
		local texture = GetInventoryItemTexture("player", ContainerIDToInventoryID(bagID));
		if(texture) then
			SetItemButtonTexture(bag, texture);
		else
			SetItemButtonTexture(bag, nil);
		end
		BagnonBag_SetCount(bag, GetInventoryItemCount("player", ContainerIDToInventoryID(bagID)));
	end
end

--this function is used when updating the frame's size based on a bag being replaced/removed/added, so we don't care about the keyring
function BagnonBag_UpdateFrameSize(bagFrame)
	local size = 0;
	for _, bag in pairs( { bagFrame:GetChildren() } ) do
		if(bag:GetID() ~= KEYRING_CONTAINER) then
			size = size + GetContainerNumSlots(bag:GetID());
		end
	end

	--only generate the frame again if the size of the frame changed
	if(bagFrame.size ~= size) then
		BagnonFrame_Generate( bagFrame:GetParent() );
	end
	bagFrame.size = size;
end

function BagnonBag_SetCount(button, count)
	if ( not button ) then return; end
	
	if ( not count ) then
		count = 0;
	end

	button.count = count;
	if ( count > 1 or (button.isBag and count > 0) ) then
		local countText = getglobal(button:GetName().."Count");
		if(count > 9999) then
			countText:SetFont(NumberFontNormal:GetFont(), 10, "OUTLINE");
		elseif(count > 999) then
			countText:SetFont(NumberFontNormal:GetFont(), 11, "OUTLINE");
		else
			countText:SetFont(NumberFontNormal:GetFont(), 12, "OUTLINE");
		end
		countText:SetText(count);
		countText:Show();
	else
		getglobal(button:GetName().."Count"):Hide();
	end
end