-- Constants
TITAN_PANEL_UPDATE_BUTTON = 1;
TITAN_PANEL_UDPATE_TOOLTIP = 2;
TITAN_PANEL_UPDATE_ALL = 3;
TITAN_PANEL_LABEL_SEPARATOR = "  "

TITAN_PANEL_BUTTON_TYPE_TEXT = 1;
TITAN_PANEL_BUTTON_TYPE_ICON = 2;
TITAN_PANEL_BUTTON_TYPE_COMBO = 3;
TITAN_PANEL_BUTTON_TYPE_CUSTOM = 4;

TITAN_RIDER_ID = "Rider";
TITAN_RIDER_FREQUENCY = 1;
TITAN_RIDER_ATTACKBUTTON = 0;

TITAN_RIDER_IS_MOUNTED = false;
TITAN_DOUBLE_CHECK = false;

TITAN_RIDER_LOCALE = {
	menu = "Rider",
	tooltip = "Rider",
	button = "Rider"
};

CURRENTSTATE = TitanGetVar(TITAN_RIDER_ID,"PlayerState");

function TitanPanelRiderButton_OnLoad()
	-- register plugin
	this.registry = { 
		id = TITAN_RIDER_ID,
		menuText = TITAN_RIDER_LOCALE["menu"],
		buttonTextFunction = "TitanPanelRiderButton_GetButtonText",
		tooltipTitle = TITAN_RIDER_LOCALE["tooltip"],
		tooltipTextFunction = "TitanPanelRiderButton_GetTooltipText",
		frequency = TITAN_RIDER_FREQUENCY, 
		icon = "Interface\\AddOns\\Titan\\Artwork\\TitanRider",
		iconWidth = 16,
		savedVariables = {
			ShowIcon = 1,
			ShowLabelText = 1,
			ShowColoredText = TITAN_NIL,
			ShowState = 1,
			PlayerState = 1,
			RiderItems = {"FeetSlot","Trinket0Slot","HandsSlot"}
		}
	};
	this:RegisterEvent("VARIABLES_LOADED")		-- configuration loading
	this:RegisterEvent("PLAYER_AURAS_CHANGED")	-- mount buff check
	this:RegisterEvent("ACTIONBAR_UPDATE_USABLE")	-- flight path check
	this:RegisterEvent("PLAYER_REGEN_DISABLED")	-- combat check
	this:RegisterEvent("PLAYER_REGEN_ENABLED")	-- combat check
	this:RegisterEvent("DELETE_ITEM_CONFIRM")		-- delete check
	this:RegisterEvent("PLAYER_ENTERING_WORLD");
	this:RegisterEvent("PLAYER_UNGHOST");
	 
end

function TitanPanelRiderButton_GetButtonText(id)
	local retstr = "";

	-- supports turning off labels
	if (TitanGetVar(TITAN_RIDER_ID, "ShowLabelText")) then	
		retstr = TITAN_RIDER_LOCALE["button"];
		if TitanGetVar(TITAN_RIDER_ID,"ShowState") then
			retstr = retstr .. ": ";
		end
	end

	if TitanGetVar(TITAN_RIDER_ID,"ShowState") then
		if (TitanGetVar(TITAN_RIDER_ID, "ShowColoredText")) then	
			retstr = retstr .. TitanUtils_GetGreenText(TITAN_RIDER_STATES[TitanGetVar(TITAN_RIDER_ID,"PlayerState")]);
		else
			retstr = retstr .. TitanUtils_GetNormalText(TITAN_RIDER_STATES[TitanGetVar(TITAN_RIDER_ID,"PlayerState")]);
		end
	end

	-- This is a double check to ENSURE all riding equipment is removed as there are cases it will skip or miss the equip swap
	local EquipGear = 0;
	if TITAN_RIDER_IS_MOUNTED == false and combat_flag == false and TITAN_DOUBLE_CHECK == true then
		TitanRider_SwitchGear()
	end

	return retstr;
end

function TitanPanelRiderButton_GetTooltipText()
	local retstr = "";
	retstr = retstr .. TitanUtils_GetGreenText(TITAN_RIDER_HINT..TITAN_RIDER_STATES[TitanGetVar(TITAN_RIDER_ID,"PlayerState")]);
	return retstr;
end

function TitanPanelRightClickMenu_PrepareRiderMenu()
	TitanPanelRightClickMenu_AddTitle(TitanPlugins[TITAN_RIDER_ID].menuText);
	
	TitanPanelRightClickMenu_AddSpacer();	

	TitanPanelRightClickMenu_AddToggleIcon(TITAN_RIDER_ID);
	TitanPanelRightClickMenu_AddToggleLabelText(TITAN_RIDER_ID);
	TitanPanelRightClickMenu_AddToggleColoredText(TITAN_RIDER_ID);
	
	info = {};
	info.text = TITAN_RIDER_OPTIONS_SHOWSTATE;
	info.func = TitanRider_StateToggle;
	info.value = TITAN_RIDER_OPTIONS_SHOWSTATE;
	info.checked = TitanGetVar(TITAN_RIDER_ID,"ShowState");
	UIDropDownMenu_AddButton(info, UIDROPDOWNMENU_MENU_LEVEL);

	info = {};
	TitanPanelRightClickMenu_AddSpacer();	
	TitanPanelRightClickMenu_AddCommand(TITAN_PANEL_MENU_HIDE, TITAN_RIDER_ID, TITAN_PANEL_MENU_FUNC_HIDE);
end

function TitalPanelRiderButton_OnClick(button)
	if ( button == "LeftButton" ) then
		--Nothing so far
	end
end

function TitanPanelRiderButton_OnEvent()
	if(event == "VARIABLES_LOADED") then
		combat_flag = false;
	end

	if event == "PLAYER_REGEN_DISABLED" then
		combat_flag = true
	end
	  
	if event == "PLAYER_REGEN_ENABLED" then
		combat_flag = false
	end

	if event == "PLAYER_ENTERING_WORLD" then
		combat_flag = false
	end

	if event == "PLAYER_UNGHOST" then
		combat_flag = false
	end

	if combat_flag == false then
		TitanSetVar(TITAN_RIDER_ID,"PlayerState",TitanRider_PlayerMounted());
		if CURRENTSTATE ~= TitanGetVar(TITAN_RIDER_ID,"PlayerState") then
			CURRENTSTATE = TitanGetVar(TITAN_RIDER_ID,"PlayerState");
			TitanRider_SwitchGear();
		end
	end
end

function TitanRider_StateToggle()
	TitanToggleVar(TITAN_RIDER_ID, "ShowState");
end

function TitanRider_PlayerMounted()
	local playerClass = UnitClass("player");
	local onflight = false
	TITAN_DOUBLE_CHECK = false;

	for i = 1,16 do
		local buff_texture = UnitBuff("player", i)
		local debuff_texture = UnitDebuff("player", i)
		if debuff_texture and string.find(debuff_texture, "Polymorph") then
			TITAN_RIDER_IS_MOUNTED = false;
			return 4;
		end
		if playerClass == "Paladin" or playerClass == "Warlock" then
			if buff_texture and string.find(buff_texture, "Spell_Nature_Swiftness") then
				TITAN_RIDER_IS_MOUNTED = true;
				TITAN_DOUBLE_CHECK = true;
				return 2;
			end
		end
		if buff_texture and ( string.find(buff_texture, "Mount") or string.find(buff_texture, "Foot_Kodo") or ( detectedIcon ~= nil and string.find(buff_texture, detectedIcon) ) ) then
			-- Make sure it isn't "Aspect of the xxx" or "Tiger's Fury"
			local BuffName = TitanRider_GetBuffName(i);
			local Skip = false;
			if BuffName and ( string.find(BuffName, "Aspect") or string.find(BuffName, "Aspekt") or string.find(BuffName, "Tiger's Fury") ) then
				Skip = true
			end
			if Skip == false then
				TITAN_RIDER_IS_MOUNTED = true;
				TITAN_DOUBLE_CHECK = true;
				return 2;
			end
		end
	end
	
	onflight = UnitOnTaxi("player")
	if onflight == 1 then
		TITAN_RIDER_IS_MOUNTED = true;
		TITAN_DOUBLE_CHECK = true;
		return 3;
	else
		TITAN_RIDER_IS_MOUNTED = false;
		return 1;
	end
end

function TitanRider_GetBuffName(buffIndex)
	local x, y = GetPlayerBuff(buffIndex, "HELPFUL");
	TitanRiderTooltip:SetUnitBuff("player", buffIndex);
  local Bname = TitanRiderTooltipTextLeft1:GetText();

	if ( Bname ~= nil ) then
		return Bname;
	end
	return nil;
end

function TitanRider_SwitchGear()
	if (TITAN_RIDER_IS_MOUNTED) then
		TitanRider_EquipRidingGear();
	else 
		if (UnitHealth ("player") > 1) then
			TitanRider_RemoveRidingGear();
		end
	end			
end

function TitanRider_EquipRidingGear()
	local EquipGear = 0;
	for EquipGear = 1, TITAN_RIDER_ITEMS do
		--if (TitanGetVarTable(TITAN_RIDER_ID,"RiderItems",EquipGear) == TITAN_RIDER_ITEM_SLOTS[EquipGear] or TitanGetVarTable(TITAN_RIDER_ID,"RiderItems",EquipGear) == "-none-") then
		local bagNum, itemInBagNum = TitanRider_FindInventoryItemWithText(TITAN_RIDER_ITEM_NAMES[EquipGear], TITAN_RIDER_ITEM_DESCS[EquipGear]);

		if (bagNum ~= nil) then
			local newItemLink = GetContainerItemLink (bagNum, itemInBagNum);
			local normalItemLink   = GetInventoryItemLink("player", GetInventorySlotInfo(TITAN_RIDER_ITEM_SLOTS[EquipGear]));
	
			if (normalItemLink ~= nil) then
				local gearBagNum, gearItemInBagNum, tempstr;
	
				_, _, tempstr = string.find (normalItemLink,   "%[(.+)%]");
				TitanSetVarTable(TITAN_RIDER_ID,"RiderItems", EquipGear, tempstr);
			else
				TitanSetVarTable(TITAN_RIDER_ID,"RiderItems", EquipGear, "-none-");
			end
	
			if (CursorHasItem()) then PickupSpell(1, "spell"); end
			PickupContainerItem (bagNum, itemInBagNum);
			AutoEquipCursorItem();
		else
			TitanSetVarTable(TITAN_RIDER_ID,"RiderItems",EquipGear,"-none-");
		end
		--end
	end
end

function TitanRider_RemoveRidingGear()
	local EquipGear = 0;
	for EquipGear = 1, TITAN_RIDER_ITEMS do
		if (TitanGetVarTable(TITAN_RIDER_ID,"RiderItems",EquipGear) ~= TITAN_RIDER_ITEM_SLOTS[EquipGear]) then
			local bagNum, itemInBagNum = TitanRider_FindInventoryItemWithText(TitanGetVarTable(TITAN_RIDER_ID,"RiderItems",EquipGear));

			if (bagNum ~= nil) then
				local normalItemLink = GetContainerItemLink(bagNum, itemInBagNum);
				if (CursorHasItem()) then PickupSpell(1, "spell"); end
				PickupContainerItem (bagNum, itemInBagNum);
				AutoEquipCursorItem();
			end
			local newItemLink = GetInventoryItemLink("player", GetInventorySlotInfo(TITAN_RIDER_ITEM_SLOTS[EquipGear]));
			if newItemLink == normalItemLink then
				TitanSetVarTable(TITAN_RIDER_ID,"RiderItems",EquipGear,TITAN_RIDER_ITEM_SLOTS[EquipGear]);
				TITAN_DOUBLE_CHECK = false;
			end
		end
	end
end

function TitanRider_FindInventoryItemWithText(name, description)
	local bagNum;
	
	for bagNum = 0, 4 do
		local itemInBagNum;
		for itemInBagNum = 1, GetContainerNumSlots (bagNum) do
			local i;
			local text = TitanRider_GetItemName(bagNum, itemInBagNum);
			--Loop through tooltip
			for i = 1, 15, 1 do
				local field = getglobal("TitanRiderTooltipTextLeft" .. i);
				if (field ~= nil) then
					local text = field:GetText();
					if (i == 1) then
						if ((name ~= nil) and (text ~= name)) then
							break;
						else
							if (description == nil) then
								return bagNum, itemInBagNum;
							end
						end
					else
						if (text == description) then
							return bagNum, itemInBagNum;
						end
					end
				end
			end
		end
	end
	return nil;
end

function TitanRider_GetItemName(bag, slot)
	local bagNumber = bag;
	local name = "";
	if ( type(bagNumber) ~= "number" ) then
		bagNumber = tonumber(bag);
	end
	--if (bagNumber <= QM_NIL) then
	--	TitanRiderTooltip:SetInventoryItem("player", slot);
	--else
		TitanRiderTooltip:SetBagItem(bag, slot);
	--end
	name = TitanRiderTooltipTextLeft1:GetText();
	if name == nil then
		name = "";
	end
	return name;
end