--[[
	item.lua
		Functions used by the item slots in Bagnon
		
	TODO:
		Code review
		Ability to disable item borders 
--]]

--[[ 
	Item Button Constructor
		The dummyBag is purely for compatibility with mods that need the same structure as a blizzard bag
		Blizzard bag functions use item:GetID() to reference the item slot, and item:GetParent():GetID() to reference their bag
		
		I'm fairly certain that the memory impact is still quite minimal.
--]]

function BagnonItem_Create(name, parent)
	--create the button
	local button = CreateFrame("Button", name, parent, "BagnonItemTemplate");
	button:SetAlpha(parent:GetParent():GetAlpha());
	
	button:RegisterForClicks("LeftButtonUp", "RightButtonUp");
	button:RegisterForDrag("LeftButton");
	
	--Fix for AxuItemMenus
	if AxuItemMenus_DropDown then
		button.SplitStack = function(itemButton, split) SplitContainerItem(itemButton:GetParent():GetID() , itemButton:GetID(), split); end;
	end

	return button;
end

function BagnonItem_OnClick(mouseButton, ignoreModifiers)
	if this.isLink then
		if this.hasItem then
			if mouseButton == "LeftButton" then
				if IsControlKeyDown() then
					local itemSlot = this:GetID(); 
					local bagID = this:GetParent():GetID();
					local player = this:GetParent():GetParent().player;
					
					DressUpItemLink((BagnonDB.GetItemData(player, bagID, itemSlot)));
				elseif IsShiftKeyDown() then
					local itemSlot = this:GetID(); 
					local bagID = this:GetParent():GetID();
					local player = this:GetParent():GetParent().player;
					
					ChatFrameEditBox:Insert(BagnonDB.GetItemHyperlink(player, bagID, itemSlot));
				end
			end
		end
	else
		ContainerFrameItemButton_OnClick(mouseButton, ignoreModifiers);
	end
end

--[[
	Show tooltip on hover
--]]

function BagnonItem_OnEnter(item)
	--link case
	if item.isLink then
		if item.hasItem then
			GameTooltip:SetOwner(item);
			
			local itemSlot = item:GetID(); 
			local bagID = item:GetParent():GetID();
			local player = item:GetParent():GetParent().player;
			
			local link, count = BagnonDB.GetItemData(player, bagID, itemSlot);
			GameTooltip:SetHyperlink( link, count );
			
			Bagnon_AnchorTooltip(item);
		end
	--normal bag case
	else	
		--blizzard totally needs to make the bank item not a special case
		if item:GetParent():GetID() == -1 then
			GameTooltip:SetOwner(item);
			GameTooltip:SetInventoryItem("player", BankButtonIDToInvSlotID( item:GetID() ) );
		--normal item case
		else
			ContainerFrameItemButton_OnEnter(item);
		end
		
		--Don't reposition tooltips for things using EnhTooltip
		if not EnhTooltip then
			Bagnon_AnchorTooltip(item);
		end
	end
end

function BagnonItem_OnUpdate()
	if GameTooltip:IsOwned(this) then
		BagnonItem_OnEnter(this)
	end
end

--[[
	Update Functions
--]]

-- Update the texture, lock status, and other information about an item
function BagnonItem_Update(item)
	local itemLink, texture, itemCount, readable, locked;
	
	if Bagnon_IsCachedItem(item) then
		item.isLink = 1;
		
		local itemSlot = item:GetID(); 
		local bagID = item:GetParent():GetID();
		local player = item:GetParent():GetParent().player;
		
		_, itemCount, texture, quality = BagnonDB.GetItemData(player, bagID, itemSlot);
		BagnonItem_UpdateLinkBorder(item, quality);
		
		if texture then
			item.hasItem = 1;
		else
			item.hasItem = nil;
		end
		
		--hide cooldown since there isn't one for linked items
		BagnonItem_UpdateCooldown(bagID, item);
	else
		item.isLink = nil;
		
		texture, itemCount, locked, _, readable = GetContainerItemInfo(item:GetParent():GetID(), item:GetID());
		BagnonItem_UpdateBorder(item);

		if texture then
			BagnonItem_UpdateCooldown(item:GetParent():GetID() , item);
			item.hasItem = 1;
		else
			getglobal(item:GetName() .. "Cooldown"):Hide();
			item.hasItem = nil;
		end
		
		SetItemButtonDesaturated(item, locked, 0.5, 0.5, 0.5);
		item.readable = readable;
	end
	
	--update texture and count
	SetItemButtonTexture(item, texture);
	SetItemButtonCount(item, itemCount);
end

function BagnonItem_UpdateBorder(button)
	local bagID = button:GetParent():GetID();
	
	if BagnonSets.qualityBorders then
		--Adapted from OneBag.  The author had a clever idea of using the link to generate the color
		local link = (GetContainerItemLink(bagID , button:GetID()));
		if link then
			local _, _, hexString = strfind(link ,"|cff([%l%d]+)|H");
			local red = tonumber(strsub(hexString, 1, 2), 16)/256;
			local green = tonumber(strsub(hexString, 3, 4), 16)/256;
			local blue = tonumber(strsub(hexString, 5, 6), 16)/256;
			if red ~= green and red ~= blue then
				getglobal(button:GetName() .. "Border"):SetVertexColor(red, green, blue, 0.5);
				getglobal(button:GetName() .. "Border"):Show();
			else
				getglobal(button:GetName() .. "Border"):Hide();
			end
		else
			getglobal(button:GetName() .. "Border"):Hide();
		end
	else
		getglobal(button:GetName() .. "Border"):Hide();
	end
	
	--ammo slot coloring
	if bagID == KEYRING_CONTAINER then
		getglobal(button:GetName() .. "NormalTexture"):SetVertexColor(1, 0.7, 0);
	elseif Bagnon_IsAmmoBag(bagID) then
		getglobal(button:GetName() .. "NormalTexture"):SetVertexColor(1, 1, 0);
	elseif Bagnon_IsProfessionBag(bagID) then
		getglobal(button:GetName() .. "NormalTexture"):SetVertexColor(0, 1, 0);
	else
		getglobal(button:GetName() .. "NormalTexture"):SetVertexColor(1, 1, 1);
	end
end

function BagnonItem_UpdateLinkBorder(item, quality)
	local itemSlot = item:GetID(); 
	local bagID = item:GetParent():GetID();
	local player = item:GetParent():GetParent().player;
		
	if BagnonSets.qualityBorders then
		if not quality then
			local link = (BagnonDB.GetItemData(player, bagID, itemSlot));
			if link then
				_, _, quality = GetItemInfo(link);
			end
		end
		if quality and quality > 1 then
			local red, green, blue = GetItemQualityColor(quality);		
			getglobal(item:GetName() .. "Border"):SetVertexColor(red, green, blue, 0.5);
			getglobal(item:GetName() .. "Border"):Show();
		else
			getglobal(item:GetName() .. "Border"):Hide();
		end
	else
		getglobal(item:GetName() .. "Border"):Hide();
	end
	
	if bagID == KEYRING_CONTAINER then
		getglobal(item:GetName() .. "NormalTexture"):SetVertexColor(1, 0.7, 0);
	elseif Bagnon_IsAmmoBag(bagID, player) then
		getglobal(item:GetName() .. "NormalTexture"):SetVertexColor(1, 1, 0);
	elseif Bagnon_IsProfessionBag(bagID , player) then
		getglobal(item:GetName() .. "NormalTexture"):SetVertexColor(0, 1, 0);
	else
		getglobal(item:GetName() .. "NormalTexture"):SetVertexColor(1, 1, 1);
	end
end

--Update cooldown
function BagnonItem_UpdateCooldown(container, button)
	if button.isLink then
		CooldownFrame_SetTimer(getglobal(button:GetName().."Cooldown"), 0, 0, 0);
	else
		local cooldown = getglobal(button:GetName().."Cooldown");
		local start, duration, enable = GetContainerItemCooldown( container, button:GetID() );

		CooldownFrame_SetTimer(cooldown, start, duration, enable);

		if duration > 0 and enable == 0 then
			SetItemButtonTextureVertexColor(button, 0.4, 0.4, 0.4);
		end
	end
end