local QBCore = exports['qb-core']:GetCoreObject()
 
if Config.weaponHolster then 
	local weapons = {
		'WEAPON_KNIFE',
		'WEAPON_NIGHTSTICK',
		'WEAPON_BREAD',
		'WEAPON_FLASHLIGHT',
		'WEAPON_HAMMER',
		'WEAPON_BAT',
		'WEAPON_GOLFCLUB',
		'WEAPON_CROWBAR',
		'WEAPON_BOTTLE',
		'WEAPON_DAGGER',
		'WEAPON_HATCHET',
		'WEAPON_MACHETE',
		'WEAPON_SWITCHBLADE',
		'WEAPON_BATTLEAXE',
		'WEAPON_POOLCUE',
		'WEAPON_WRENCH',
		'WEAPON_PISTOL',
		'WEAPON_PISTOL_MK2',
		'WEAPON_COMBATPISTOL',
		'WEAPON_APPISTOL',
		'WEAPON_PISTOL50',
		'WEAPON_REVOLVER',
		'WEAPON_SNSPISTOL',
		'WEAPON_HEAVYPISTOL',
		'WEAPON_VINTAGEPISTOL',
		'WEAPON_MICROSMG',
		'WEAPON_SMG',
		'WEAPON_ASSAULTSMG',
		'WEAPON_MINISMG',
		'WEAPON_MACHINEPISTOL',
		'WEAPON_COMBATPDW',
		'WEAPON_PUMPSHOTGUN',
		'WEAPON_SAWNOFFSHOTGUN',
		'WEAPON_ASSAULTSHOTGUN',
		'WEAPON_BULLPUPSHOTGUN',
		'WEAPON_HEAVYSHOTGUN',
		'WEAPON_ASSAULTRIFLE',
		'WEAPON_CARBINERIFLE',
		'WEAPON_ADVANCEDRIFLE',
		'WEAPON_SPECIALCARBINE',
		'WEAPON_BULLPUPRIFLE',
		'WEAPON_COMPACTRIFLE',
		'WEAPON_MG',
		'WEAPON_COMBATMG',
		'WEAPON_GUSENBERG',
		'WEAPON_SNIPERRIFLE',
		'WEAPON_HEAVYSNIPER',
		'WEAPON_MARKSMANRIFLE',
		'WEAPON_GRENADELAUNCHER',
		'WEAPON_RPG',
		'WEAPON_STINGER',
		'WEAPON_MINIGUN',
		'WEAPON_GRENADE',
		'WEAPON_STICKYBOMB',
		'WEAPON_SMOKEGRENADE',
		'WEAPON_BZGAS',
		'WEAPON_MOLOTOV',
		'WEAPON_DIGISCANNER',
		'WEAPON_FIREWORK',
		'WEAPON_MUSKET',
		'WEAPON_STUNGUN',
		'WEAPON_HOMINGLAUNCHER',
		'WEAPON_PROXMINE',
		'WEAPON_FLAREGUN',
		'WEAPON_MARKSMANPISTOL',
		'WEAPON_RAILGUN',
		'WEAPON_DBSHOTGUN',
		'WEAPON_AUTOSHOTGUN',
		'WEAPON_COMPACTLAUNCHER',
		'WEAPON_PIPEBOMB',
		'WEAPON_DOUBLEACTION',
	}
	
	-- Wheapons that require the Police holster animation
	local holsterableWeapons = {
		'WEAPON_STUNGUN',
		'WEAPON_PISTOL',
		'WEAPON_PISTOL_MK2',
		'WEAPON_COMBATPISTOL',
		'WEAPON_APPISTOL',
		'WEAPON_PISTOL50',
		'WEAPON_REVOLVER',
		'WEAPON_SNSPISTOL',
		'WEAPON_HEAVYPISTOL',
		'WEAPON_VINTAGEPISTOL'
	}
	
	local holstered = true
	local canFire = true
	local currWeapon = GetHashKey('WEAPON_UNARMED')
	local currentHoldster = nil
	
	CreateThread(function()
		while true do
			local ped = PlayerPedId()
			if DoesEntityExist(ped) and not IsEntityDead(ped) then
				if currWeapon ~= GetSelectedPedWeapon(PlayerPedId()) then
					pos = GetEntityCoords(PlayerPedId(), true)
					rot = GetEntityHeading(PlayerPedId())
	
					local newWeap = GetSelectedPedWeapon(PlayerPedId())
					SetCurrentPedWeapon(PlayerPedId(), currWeapon, true)
					loadAnimDict("reaction@intimidation@1h")
					loadAnimDict("reaction@intimidation@cop@unarmed")
					loadAnimDict("rcmjosh4")
					loadAnimDict("weapons@pistol@")
					if CheckWeapon(newWeap) then
						if holstered then
							if QBCore.Functions.GetPlayerData().job.name == "police" then
								canFire = false
								currentHoldster = GetPedDrawableVariation(PlayerPedId(), 7)
								TaskPlayAnimAdvanced(PlayerPedId(), "rcmjosh4", "josh_leadout_cop2", GetEntityCoords(PlayerPedId(), true), 0, 0, rot, 3.0, 3.0, -1, 50, 0, 0, 0)
								Wait(300)
								SetCurrentPedWeapon(PlayerPedId(), newWeap, true)
	
								if IsWeaponHolsterable(newWeap) then
									if currentHoldster == 8 then
										SetPedComponentVariation(PlayerPedId(), 7, 2, 0, 2)
									elseif currentHoldster == 1 then
										SetPedComponentVariation(PlayerPedId(), 7, 3, 0, 2)
									elseif currentHoldster == 6 then
										SetPedComponentVariation(PlayerPedId(), 7, 5, 0, 2)
									end
								end
								currWeapon = newWeap
								Wait(300)
								ClearPedTasks(PlayerPedId())
								holstered = false
								canFire = true
							else
								canFire = false
								TaskPlayAnimAdvanced(PlayerPedId(), "reaction@intimidation@1h", "intro", GetEntityCoords(PlayerPedId(), true), 0, 0, rot, 8.0, 3.0, -1, 50, 0, 0, 0)
								Wait(1000)
								SetCurrentPedWeapon(PlayerPedId(), newWeap, true)
								currWeapon = newWeap
								Wait(1400)
								ClearPedTasks(PlayerPedId())
								holstered = false
								canFire = true
							end
						elseif newWeap ~= currWeapon and CheckWeapon(currWeapon) then
							if QBCore.Functions.GetPlayerData().job.name == "police" then
								canFire = false
	
								TaskPlayAnimAdvanced(PlayerPedId(), "reaction@intimidation@cop@unarmed", "intro", GetEntityCoords(PlayerPedId(), true), 0, 0, rot, 3.0, 3.0, -1, 50, 0, 0, 0)
								Wait(500)
	
								if IsWeaponHolsterable(currWeapon) then
									SetPedComponentVariation(PlayerPedId(), 7, currentHoldster, 0, 2)
								end
	
								SetCurrentPedWeapon(PlayerPedId(), GetHashKey('WEAPON_UNARMED'), true)
								currentHoldster = GetPedDrawableVariation(PlayerPedId(), 7)
	
								TaskPlayAnimAdvanced(PlayerPedId(), "rcmjosh4", "josh_leadout_cop2", GetEntityCoords(PlayerPedId(), true), 0, 0, rot, 3.0, 3.0, -1, 50, 0, 0, 0)
								Wait(300)
								SetCurrentPedWeapon(PlayerPedId(), newWeap, true)
	
								if IsWeaponHolsterable(newWeap) then
									if currentHoldster == 8 then
										SetPedComponentVariation(PlayerPedId(), 7, 2, 0, 2)
									elseif currentHoldster == 1 then
										SetPedComponentVariation(PlayerPedId(), 7, 3, 0, 2)
									elseif currentHoldster == 6 then
										SetPedComponentVariation(PlayerPedId(), 7, 5, 0, 2)
									end
								end
	
								Wait(500)
								currWeapon = newWeap
								ClearPedTasks(PlayerPedId())
								holstered = false
								canFire = true
							else
								canFire = false
								TaskPlayAnimAdvanced(PlayerPedId(), "reaction@intimidation@1h", "outro", GetEntityCoords(PlayerPedId(), true), 0, 0, rot, 8.0, 3.0, -1, 50, 0, 0, 0)
								Wait(1600)
								SetCurrentPedWeapon(PlayerPedId(), GetHashKey('WEAPON_UNARMED'), true)
								TaskPlayAnimAdvanced(PlayerPedId(), "reaction@intimidation@1h", "intro", GetEntityCoords(PlayerPedId(), true), 0, 0, rot, 8.0, 3.0, -1, 50, 0, 0, 0)
								Wait(1000)
								SetCurrentPedWeapon(PlayerPedId(), newWeap, true)
								currWeapon = newWeap
								Wait(1400)
								ClearPedTasks(PlayerPedId())
								holstered = false
								canFire = true
							end
						else
							if QBCore.Functions.GetPlayerData().job.name == "police" then
								SetCurrentPedWeapon(PlayerPedId(), GetHashKey('WEAPON_UNARMED'), true)
								currentHoldster = GetPedDrawableVariation(PlayerPedId(), 7)
								TaskPlayAnimAdvanced(PlayerPedId(), "rcmjosh4", "josh_leadout_cop2", GetEntityCoords(PlayerPedId(), true), 0, 0, rot, 3.0, 3.0, -1, 50, 0, 0, 0)
								Wait(300)
								SetCurrentPedWeapon(PlayerPedId(), newWeap, true)
	
								if IsWeaponHolsterable(newWeap) then
									if currentHoldster == 8 then
										SetPedComponentVariation(PlayerPedId(), 7, 2, 0, 2)
									elseif currentHoldster == 1 then
										SetPedComponentVariation(PlayerPedId(), 7, 3, 0, 2)
									elseif currentHoldster == 6 then
										SetPedComponentVariation(PlayerPedId(), 7, 5, 0, 2)
									end
								end
	
								currWeapon = newWeap
								Wait(300)
								ClearPedTasks(PlayerPedId())
								holstered = false
								canFire = true
							else
								SetCurrentPedWeapon(PlayerPedId(), GetHashKey('WEAPON_UNARMED'), true)
								TaskPlayAnimAdvanced(PlayerPedId(), "reaction@intimidation@1h", "intro", GetEntityCoords(PlayerPedId(), true), 0, 0, rot, 8.0, 3.0, -1, 50, 0, 0, 0)
								Wait(1000)
								SetCurrentPedWeapon(PlayerPedId(), newWeap, true)
								currWeapon = newWeap
								Wait(1400)
								ClearPedTasks(PlayerPedId())
								holstered = false
								canFire = true
							end
						end
					else
						if not holstered and CheckWeapon(currWeapon) then
							if QBCore.Functions.GetPlayerData().job.name == "police" then
								canFire = false
								TaskPlayAnimAdvanced(PlayerPedId(), "reaction@intimidation@cop@unarmed", "intro", GetEntityCoords(PlayerPedId(), true), 0, 0, rot, 3.0, 3.0, -1, 50, 0, 0, 0)
								Wait(500)
								
								if IsWeaponHolsterable(currWeapon) then
									SetPedComponentVariation(PlayerPedId(), 7, currentHoldster, 0, 2)
								end
	
								SetCurrentPedWeapon(PlayerPedId(), GetHashKey('WEAPON_UNARMED'), true)
								ClearPedTasks(PlayerPedId())
								SetCurrentPedWeapon(PlayerPedId(), newWeap, true)
								holstered = true
								canFire = true
								currWeapon = newWeap
							else
								canFire = false
								TaskPlayAnimAdvanced(PlayerPedId(), "reaction@intimidation@1h", "outro", GetEntityCoords(PlayerPedId(), true), 0, 0, rot, 8.0, 3.0, -1, 50, 0, 0, 0)
								Wait(1400)
								SetCurrentPedWeapon(PlayerPedId(), GetHashKey('WEAPON_UNARMED'), true)
								ClearPedTasks(PlayerPedId())
								SetCurrentPedWeapon(PlayerPedId(), newWeap, true)
								holstered = true
								canFire = true
								currWeapon = newWeap
							end
						else
							SetCurrentPedWeapon(PlayerPedId(), newWeap, true)
							holstered = false
							canFire = true
							currWeapon = newWeap
						end
					end
				end
			else
				Wait(250)
			end
	
			Wait(5)
		end
	end)
	
	
	CreateThread(function()
		while true do
			if not canFire then
				DisableControlAction(0, 25, true)
				DisablePlayerFiring(PlayerPedId(), true)
			else
				Wait(250)
			end
	
			Wait(3)
		end
	end)
	
	function CheckWeapon(newWeap)
		for i = 1, #weapons do
			if GetHashKey(weapons[i]) == newWeap then
				return true
			end
		end
		return false
	end
	
	function IsWeaponHolsterable(weap)
		for i = 1, #holsterableWeapons do
			if GetHashKey(holsterableWeapons[i]) == weap then
				return true
			end
		end
		return false
	end
	
	function loadAnimDict(dict)
		while (not HasAnimDictLoaded(dict)) do
			RequestAnimDict(dict)
			Wait(5)
		end
	end
end