--[[
-- **************************************************************************
-- * TitanAmmo.lua
-- *
-- * By: Titan Panel Development Team
-- **************************************************************************
-- 2019 Aug - reverted and updated for Classic
--
-- This will track the count of ammo (bows and guns) or thrown (knives) equipped. 
-- Ammo is placed in the 'ammo' slot where Blizzard counts ALL of that *type of ammo*
-- regardless of where it is in your bags.
-- Thrown is placed in the actual weapon slot where Blizzard counts ALL of that *type of thrown*.
-- This forces a different routine to be used so the ammo must always be checked for type and count.
--]]
-- ******************************** Constants *******************************
local _G = getfenv(0);
local TITAN_AMMO_ID = "Ammo";

local SHOOT_STACK = 200
local ARROW_STACK = 200
local THROW_STACK = 200

local LIM_GOOD = 2
local LIM_OK   = 1.5
local LIM_BAD  = .5

local BOW = "INVTYPE_RANGED"
local GUN = "INVTYPE_RANGEDRIGHT"
local THROWN = "INVTYPE_THROWN"

local TITAN_AMMO_THRESHOLD_TABLE = { -- Use ammo stack and threshold limits above to calc colored text
	["INVTYPE_RANGEDRIGHT"] = {
		 Values = { SHOOT_STACK*LIM_BAD, SHOOT_STACK*LIM_OK, SHOOT_STACK*LIM_GOOD }, -- 100,150,400
		 Colors = { RED_FONT_COLOR, ORANGE_FONT_COLOR, NORMAL_FONT_COLOR, HIGHLIGHT_FONT_COLOR },
	 },
	["INVTYPE_RANGED"] = {
		 Values = { ARROW_STACK*LIM_BAD, ARROW_STACK*LIM_OK, ARROW_STACK*LIM_GOOD }, -- 100,150,400
		 Colors = { RED_FONT_COLOR, ORANGE_FONT_COLOR, NORMAL_FONT_COLOR, HIGHLIGHT_FONT_COLOR },
	 },
	["INVTYPE_THROWN"] = {
		 Values = { THROW_STACK/10, THROW_STACK/4, THROW_STACK/2 }, -- 20, 50, 100
		 Colors = { RED_FONT_COLOR, ORANGE_FONT_COLOR, NORMAL_FONT_COLOR, HIGHLIGHT_FONT_COLOR },
	 },
};

-- ******************************** Variables *******************************
local class = select(2, UnitClass("player"))
local ammoSlotID = GetInventorySlotInfo("AmmoSlot")
local rangedSlotID = GetInventorySlotInfo("RangedSlot")
local ammo_count = 0;
local ammo_type  = "";
local ammo_name  = ""
local weapon  = "";
local weapon_type  = "";
local ammo_show  = false -- show plugin based on class

local L = LibStub("AceLocale-3.0"):GetLocale("TitanClassic", true)
-- ******************************** Functions *******************************
local function ClrAmmoInfo()
	ammo_count = 0;
	ammo_type  = L["TITAN_AMMO_BUTTON_NOAMMO"];
	ammo_name  = L["TITAN_AMMO_BUTTON_NOAMMO"]
	ammo_show  = false
end
local function GetItemLink(rangedSlotID)
	return GetInventoryItemLink("player", rangedSlotID)
end
local function IsThrown(loc)
	local res = false
	if loc == "INVTYPE_THROWN" then
		res = true
	end
	return res
end
local function IsAmmo(loc)
	local res = false
	if loc == "INVTYPE_RANGED" or loc == "INVTYPE_RANGEDRIGHT" then
		res = true
	end
	return res
end

local function GetAmmoCount()
	local ammo = "";
	local w = "--";
	local wt = "--";

	local weap = GetInventoryItemID("player", rangedSlotID)
	if weap == nil then
--[[
print("GetWeaponInfo"
.." Not Found"
)
--]]
	else
		local itemName, itemLink, itemQuality, itemLevel, itemMinLevel, itemType, itemSubType, itemStackCount,
		itemEquipLoc, itemTexture, sellPrice, classID, subclassID, bindType, expacID, setID, isCraftingReagent
		   = GetItemInfo(weap)
		w = itemName
		wt = itemSubType
		ammo = itemEquipLoc
		
		-- set ammo name and count
		if IsThrown(ammo) then -- throwing knives, etc
			ammo_name = itemName or _G["UNKNOWN"]
			if ammo_name == _G["UNKNOWN"] then
				ammo_count = 0
			else
				ammo_count = GetInventoryItemCount("player", rangedSlotID) or ammo_count
			end
		else -- bullets or arrows
			ammo_name = select(1, GetItemInfo(GetInventoryItemID("player", ammoSlotID))) or _G["UNKNOWN"]
			if ammo_name == _G["UNKNOWN"] then
				ammo_count = 0
			else
				ammo_count = GetInventoryItemCount("player", ammoSlotID) or ammo_count
			end
		end
--[[
print("GetWeaponInfo"
--.." '"..tostring(weap).."'"
.." '"..tostring(w).."'"
--.." '"..tostring(wt).."'"
--.." '"..tostring(ammo).."'"
.." '"..tostring(ammo_name).."'"
.." '"..tostring(ammo_count).."'"
)
--]]
	end
	
	-- Set display variables
	weapon = w
	weapon_type = wt
	ammo_type = ammo

end


-- **************************************************************************
-- NAME : TitanPanelAmmoButton_OnLoad()
-- DESC : Registers the plugin upon it loading
-- **************************************************************************
function TitanPanelAmmoButton_OnLoad(self)
	self.registry = {
			id = TITAN_AMMO_ID,
			--builtIn = 1,
			category = "Built-ins",
			version = TITAN_VERSION,
			menuText = L["TITAN_AMMO_MENU_TEXT"],
			buttonTextFunction = "TitanPanelAmmoButton_GetButtonText", 
			tooltipTitle = L["TITAN_AMMO_TOOLTIP"],
            tooltipTextFunction = "TitanPanelAmmoButton_GetTooltipText",
			icon = "Interface\\AddOns\\TitanAmmo\\TitanClassicThrown",
			iconWidth = 16,
			controlVariables = {
			ShowIcon = true,
			ShowLabelText = true,
			ShowRegularText = false,
			ShowColoredText = true,
			DisplayOnRightSide = true
		},
		savedVariables = {
			ShowIcon = 1,
			ShowLabelText = 1,
			ShowColoredText = 1,
			ShowAmmoName = false,
			DisplayOnRightSide = false,
		}
	};     

	if class == "ROGUE" 
	or class == "WARRIOR" 
	or class == "HUNTER" 
	then
		self:SetScript("OnEvent",  function(_, event, arg1, arg2, ...)
--[[
print("OnEvent"
.." '"..tostring(event).."'"
.." '"..tostring(arg1).."'"
.." '"..tostring(arg2).."'"
)
--]]
			if event == "PLAYER_ENTERING_WORLD" then
				if arg1 == true then -- login
					TitanPanelAmmoButton_PLAYER_LOGIN()
				end
				if arg2 == true then -- reload / zoning
					TitanPanelAmmoButton_MERCHANT_CLOSED()
				end
			elseif event == "UNIT_INVENTORY_CHANGED" then
				TitanPanelAmmoButton_UNIT_INVENTORY_CHANGED(arg1, ...)
			elseif event == "UPDATE_INVENTORY_DURABILITY" then
				TitanPanelAmmoButton_UPDATE_INVENTORY_DURABILITY()
			elseif event == "MERCHANT_CLOSED" then
				TitanPanelAmmoButton_MERCHANT_CLOSED()
			elseif event == "ACTIONBAR_HIDEGRID" then -- in case ammo is dropped into char slot
				TitanPanelAmmoButton_ACTIONBAR_HIDEGRID()
			end
		end)

		TitanPanelAmmoButton:RegisterEvent("PLAYER_ENTERING_WORLD")
	
	else
		ClrAmmoInfo()
	end
end

function TitanPanelAmmoButton_PLAYER_LOGIN()
	ammo_show = true
	GetAmmoCount()

	if IsThrown(ammo_type) then
		TitanPanelAmmoButton:RegisterEvent("UPDATE_INVENTORY_DURABILITY")
	elseif IsAmmo(ammo_type) then
		TitanPanelAmmoButton:RegisterEvent("ACTIONBAR_HIDEGRID")			
	end
	TitanPanelAmmoButton:RegisterEvent("UNIT_INVENTORY_CHANGED")
	TitanPanelAmmoButton:RegisterEvent("MERCHANT_CLOSED")
	TitanPanelAmmoButton:RegisterEvent("PLAYER_ENTERING_WORLD") 

	TitanPanelButton_UpdateButton(TITAN_AMMO_ID);
end

function TitanPanelAmmoButton_UNIT_INVENTORY_CHANGED(arg1, ...)
	if arg1 == "player" then
		TitanPanelAmmoUpdateDisplay(); 	
	end
end

function TitanPanelAmmoButton_UPDATE_INVENTORY_DURABILITY()
	TitanPanelAmmoUpdateDisplay(); 	
end

function TitanPanelAmmoButton_MERCHANT_CLOSED() 
	TitanPanelAmmoUpdateDisplay(); 	
end

function TitanPanelAmmoButton_ACTIONBAR_HIDEGRID()
	local prev = 0
	TitanPanelAmmoButton:SetScript("OnUpdate", function(_, e)
		prev = prev + e
		if prev > 2 then
			TitanPanelAmmoButton:SetScript("OnUpdate", nil)
			TitanPanelAmmoUpdateDisplay(); 	
		end
	end)
end

function TitanPanelAmmoUpdateDisplay()
	-- Manual Display update in case the rangedSlot it switched
	GetAmmoCount()
	
	-- Setup the events based on ammo type
	if IsThrown(ammo_type) then
		if not TitanPanelAmmoButton:IsEventRegistered("UPDATE_INVENTORY_DURABILITY") then
			TitanPanelAmmoButton:RegisterEvent("UPDATE_INVENTORY_DURABILITY")
		end						
		if TitanPanelAmmoButton:IsEventRegistered("ACTIONBAR_HIDEGRID") then
			TitanPanelAmmoButton:UnregisterEvent("ACTIONBAR_HIDEGRID")
			TitanPanelAmmoButton:SetScript("OnUpdate", nil)				
		end
	elseif IsAmmo(ammo_type) then
		if TitanPanelAmmoButton:IsEventRegistered("UPDATE_INVENTORY_DURABILITY") then			
			TitanPanelAmmoButton:UnregisterEvent("UPDATE_INVENTORY_DURABILITY")
		end
		if not TitanPanelAmmoButton:IsEventRegistered("ACTIONBAR_HIDEGRID") then					
			TitanPanelAmmoButton:RegisterEvent("ACTIONBAR_HIDEGRID")				
		end
	end		
		
	TitanPanelButton_UpdateButton(TITAN_AMMO_ID);
end

-- **************************************************************************
-- NAME : TitanPanelAmmoButton_GetButtonText(id)
-- DESC : Calculate ammo/thrown logic then display data on button
-- VARS : id = button ID
-- **************************************************************************
function TitanPanelAmmoButton_GetButtonText(id)
     
	local labelText, ammoText, ammoRichText, color;

	if (IsThrown(ammo_type)) then		          
		labelText = L["TITAN_AMMO_BUTTON_LABEL_THROWN"];
		ammoText = format(L["TITAN_AMMO_FORMAT"], ammo_count);
		labelText = weapon_type.." : "
		if TitanGetVar(TITAN_AMMO_ID, "ShowAmmoName") and ammo_name ~= "" then
			ammoText = ammoText.."|cffffff9a".." ("..ammo_name..")".."|r"
		end
	elseif IsAmmo(ammo_type) then
		labelText = L["TITAN_AMMO_BUTTON_LABEL_AMMO"];
		labelText = weapon_type.." : "
		ammoText = format(L["TITAN_AMMO_FORMAT"], ammo_count);
		if TitanGetVar(TITAN_AMMO_ID, "ShowAmmoName") and ammo_name ~= "" then
			ammoText = ammoText.."|cffffff9a".." ("..ammo_name..")".."|r"
		end
	else   
		ClrAmmoInfo()
		ammoText = ammo_name
		labelText = weapon_type..""
	end

--[[
print("_GetButtonText"
.." '"..tostring(weapon_type).."'"
.." '"..tostring(ammo_type).."'"
)
--]]
	if (TitanGetVar(TITAN_AMMO_ID, "ShowColoredText")) then     
		color = TitanUtils_GetThresholdColor(TITAN_AMMO_THRESHOLD_TABLE[ammo_type], ammo_count);
		ammoRichText = TitanUtils_GetColoredText(ammoText, color);
	else
		ammoRichText = TitanUtils_GetHighlightText(ammoText);
	end

	return labelText, ammoRichText;
end

-- **************************************************************************
-- NAME : TitanPanelRightClickMenu_PrepareAmmoMenu()
-- DESC : Display rightclick menu options
-- **************************************************************************
function TitanPanelRightClickMenu_PrepareAmmoMenu()
	TitanPanelRightClickMenu_AddTitle(TitanPlugins[TITAN_AMMO_ID].menuText);

	local info = {};
	info.text = L["TITAN_AMMO_BULLET_NAME"];
	info.func = function() TitanPanelRightClickMenu_ToggleVar({TITAN_AMMO_ID, "ShowAmmoName"})
		TitanPanelButton_UpdateButton(TITAN_AMMO_ID);
	end
	info.checked = TitanUtils_Ternary(TitanGetVar(TITAN_AMMO_ID, "ShowAmmoName"), 1, nil);
	TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel())
	TitanPanelRightClickMenu_AddSpacer();

	info = {};
	TitanPanelRightClickMenu_AddToggleIcon(TITAN_AMMO_ID);
	TitanPanelRightClickMenu_AddToggleLabelText(TITAN_AMMO_ID);
	TitanPanelRightClickMenu_AddToggleColoredText(TITAN_AMMO_ID);

	TitanPanelRightClickMenu_AddToggleRightSide(TITAN_AMMO_ID);
	TitanPanelRightClickMenu_AddSpacer();
	TitanPanelRightClickMenu_AddCommand(L["TITAN_PANEL_MENU_HIDE"], TITAN_AMMO_ID, TITAN_PANEL_MENU_FUNC_HIDE);
end

function TitanPanelAmmoButton_GetTooltipText()
	local txt = ""
	if IsThrown(ammo_type) then
	txt = txt
		..tostring(weapon)..""
	else
		txt = txt
			..tostring(weapon).."\n"
			..tostring(ammo_name)..""
	end
	return txt
end

