local QBCore = exports['qb-core']:GetCoreObject()
GlobalState.PoppyPlants = Config.PoppyPlants


Citizen.CreateThread(function()
    for _, v in pairs(Config.PoppyPlants) do
        v.taken = false
    end
end)


function heroinCooldown(loc)
    CreateThread(function()
        Wait(Config.respawnTime * 1000)
        Config.PoppyPlants[loc].taken = false
        GlobalState.PoppyPlants = Config.PoppyPlants
        Wait(1000)
        TriggerClientEvent('heroin:respawnCane', -1, loc)
		Log('Heroin Plant Respawned At ' .. Config.PoppyPlants[loc].location, 'heroin')
    end)
end

RegisterServerEvent('md-drugs:server:removecleaningkitheroin', function(data)
local src = source
	if RemoveItem(src,"cleaningkit", 1) then
		TriggerClientEvent("md-drugs:client:deletedirtyheroin", src, data)
		Log(GetName(src) .. ' Wiped Down Their Heroin Lab Kit!' , 'heroin')
	else
		Notifys(src, "You cant clean it with spit alone", "error")
	end
end)


RegisterServerEvent("heroin:pickupCane", function(loc)
	if CheckDist(source, Config.PoppyPlants[loc].location) then return end
    if not Config.PoppyPlants[loc].taken then
        Config.PoppyPlants[loc].taken = true
        GlobalState.PoppyPlants = Config.PoppyPlants
        TriggerClientEvent("heroin:removeCane", -1, loc)
        heroinCooldown(loc)
        AddItem(source, 'poppyresin', 1)
        Log(GetName(source) .. ' Picked A Poppies With a distance of ' .. dist(source, Config.PoppyPlants[loc].location) .. ' vectors', 'heroin')
    end
end)

RegisterServerEvent('md-drugs:server:dryplant', function(num)
	local src = source
	if CheckDist(source, Config.dryplant[num]['loc']) then return end
	if not Itemcheck(source, 'poppyresin', 1) then return end
	if Config.TierSystem then
		local heroin = getRep(src, 'heroin')
		if heroin <= Config.Tier1 then
			if not GetRecipe(src, 'heroin', 'dryheroin', 'tier1') then return end
			Log(GetName(src) ..' Made Heroin Powder With a distance of ' .. dist(source, Config.dryplant[num]['loc']) .. ' vectors', 'heroin')
		elseif heroin >= Config.Tier1 and heroin <= Config.Tier2 then
			if not GetRecipe(src, 'heroin', 'dryheroin', 'tier2') then return end
			Log(GetName(src) ..' Made Heroin Powder Tier 2 With a distance of ' .. dist(source, Config.dryplant[num]['loc']) .. ' vectors', 'heroin')
		else
			if not GetRecipe(src, 'heroin', 'dryheroin', 'tier3') then return end
			Log(GetName(src) ..' Made Heroin Powder  Tier 3 With a distance of ' .. dist(source, Config.dryplant[num]['loc']) .. ' vectors', 'heroin')
		end
	else
		if not GetRecipe(src, 'heroin', 'dryheroin', 'tier1') then return end
		Log(GetName(src) ..' Made Heroin Powder With a distance of ' .. dist(source, Config.dryplant[num]['loc']) .. ' vectors', 'heroin')
	end
end)


RegisterServerEvent('md-drugs:server:cutheroin', function(num)
	local src = source
    local Player = QBCore.Functions.GetPlayer(src)
	if CheckDist(source, Config.cutheroinone[num]['loc']) then return end
	if not Itemcheck(src, 'bakingsoda', 1) then return end
	if Config.TierSystem then
		local rawh = Player.Functions.GetItemByName('heroin')
		local rawh2 = Player.Functions.GetItemByName('heroinstagetwo')
		local rawh3 = Player.Functions.GetItemByName('heroinstagethree')
		if rawh then
			if not GetRecipe(src, 'heroin', 'cutheroin', 'tier1') then return end
			Log(GetName(src) ..' Cut Heroin With a distance of ' .. dist(source, Config.cutheroinone[num]['loc']) .. ' vectors', 'heroin')
		elseif rawh2 then
			if not GetRecipe(src, 'heroin', 'cutheroin', 'tier2') then return end
			Log(GetName(src) ..' Cut Heroin Tier 2 With a distance of ' .. dist(source, Config.cutheroinone[num]['loc']) .. ' vectors', 'heroin')
		elseif rawh3 then
			if not GetRecipe(src, 'heroin', 'cutheroin', 'tier3') then return end
			Log(GetName(src) .. ' Cut Heroin Tier 3 With a distance of ' .. dist(source, Config.cutheroinone[num]['loc']) .. ' vectors', 'heroin')
		else
			Notifys(src, Lang.Heroin.noheroin, "error")
		end
	else
		if not GetRecipe(src, 'heroin', 'cutheroin', 'tier1') then return end
		Log(GetName(src) ..' Cut Heroin With a distance of ' .. dist(source, Config.cutheroinone[num]['loc']) .. ' vectors', 'heroin')
	end
end)

RegisterServerEvent('md-drugs:server:getheroinlabkit', function()
	local src = source
	local Player = QBCore.Functions.GetPlayer(src)

	if CheckDist(source, vector3(Config.buyheroinlabkit.x,Config.buyheroinlabkit.y,Config.buyheroinlabkit.z)) then return end
	if Player.Functions.RemoveMoney('cash', Config.heroinlabkitprice) then
		AddItem(src, 'heroinlabkit', 1)
		Log(GetName(src) ..' Bought A Heroin lab Kit ' .. dist(source, vector3(Config.buyheroinlabkit.x,Config.buyheroinlabkit.y,Config.buyheroinlabkit.z)) .. ' vectors', 'heroin')
	else
		Notifys(src, 'You Need '.. Config.heroinlabkitprice .. ' In Cash For This', 'error')
	end
end)

RegisterServerEvent('md-drugs:server:getheroinlabkitback', function()
local src = source
local Player = QBCore.Functions.GetPlayer(src)
	if AddItem(src, "heroinlabkit", 1) then
		Log(GetName(src) ..' Picked Up Their Heroin Lab Kit Back At ' .. GetCoords(src) .. '!', 'heroin')
	end
end)

QBCore.Functions.CreateUseableItem('heroinlabkit', function(source, item)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
	if not Itemcheck(source, 'heroinlabkit', 1) then return end
	if TriggerClientEvent("md-drugs:client:setheroinlabkit", src) then
		RemoveItem(src, "heroinlabkit", 1)
		Log(GetName(src) ..' Placed Their Heroin Lab Kit Back At ' .. GetCoords(src) .. '!', 'heroin')
	end
end)



RegisterServerEvent('md-drugs:server:heatliquidheroin', function()
local src = source
local Player = QBCore.Functions.GetPlayer(src)
	if not Itemcheck(source, 'emptyvial', 1) then return end
	if Config.TierSystem then
		local cuth = Player.Functions.GetItemByName('heroincut')
		local cuth2 = Player.Functions.GetItemByName('heroincutstagetwo')
		local cuth3 = Player.Functions.GetItemByName('heroincutstagethree')
		if cuth then
			if not GetRecipe(src, 'heroin', 'fillvial', 'tier1') then return end
			Log(GetName(src) ..' Made A Vial Of Heroin', 'heroin')
		elseif cuth2 then
			if not GetRecipe(src, 'heroin', 'fillvial', 'tier2') then return end
			Log(GetName(src) ..' Made A Vial Of Heroin Tier 2', 'heroin')
		elseif cuth3 then
			if not GetRecipe(src, 'heroin', 'fillvial', 'tier3') then return end
			Log(GetName(src) ..' Made A Vial Of Heroin Tier 3', 'heroin')
		else
			Notifys(src, 'no cut heroin', "error")
		end
	else
		if not GetRecipe(src, 'heroin', 'fillvial', 'tier1') then return end
		Log(GetName(src) ..' Made A Vial Of Heroin', 'heroin')
	end
end)

RegisterServerEvent('md-drugs:server:failheatingheroin', function()
local src = source
local Player = QBCore.Functions.GetPlayer(src)
local cuth = Player.Functions.GetItemByName('heroincut')
local cuth2 = Player.Functions.GetItemByName('heroincutstagetwo')
local cuth3 = Player.Functions.GetItemByName('heroincutstagethree')
Log(GetName(src) ..' Sucks And Burned Their Heroin', 'heroin')
	if cuth then
		RemoveItem(src, 'heroincut', 1) 
		Notifys(src,Lang.Heroin.fail, "error")
	elseif cuth2 then
		RemoveItem(src, 'heroincutstagetwo', 1) 
		Notifys(src,Lang.Heroin.fail, "error")
	elseif cuth3 then
		RemoveItem(src, 'heroincutstagethree', 1)
		Notifys(src,Lang.Heroin.fail, "error")
	end
end)


RegisterServerEvent('md-drugs:server:fillneedle', function(num)
	local src = source
    local Player = QBCore.Functions.GetPlayer(src)
	if CheckDist(source, Config.fillneedle[num]['loc']) then return end
	if not Itemcheck(src, 'needle', 1) then return end
	if Config.TierSystem then
		local heroin = getRep(src, 'heroin')
		local vh = Player.Functions.GetItemByName('heroinvial')
		local vh2 = Player.Functions.GetItemByName('heroinvialstagetwo')
		local vh3 = Player.Functions.GetItemByName('heroinvialstagethree')
		if vh then
			if not GetRecipe(src, 'heroin', 'fillneedle', 'tier1') then return end
			AddRep(src, 'heroin')
			Log(GetName(src) ..' Filled A Needle Of Heroin And Now Has A Rep Of ' .. heroin + 1 .. '!' , 'heroin')
		elseif vh2 then
			if not GetRecipe(src, 'heroin', 'fillneedle', 'tier2') then return end
			AddRep(src, 'heroin')
			Log(GetName(src) ..' Filled A Needle Of Heroin Tier 2 And Now Has A Rep Of ' .. heroin + 1 .. '!' , 'heroin')
		elseif vh3 then
			if not GetRecipe(src, 'heroin', 'fillneedle', 'tier3') then return end
			AddRep(src, 'heroin')
			Log(GetName(src) ..' Filled A Needle Of Heroin Tier 3 And Now Has A Rep Of ' .. heroin + 1  .. '!' , 'heroin')
		else
			Notifys(src,Lang.Heroin.nofill, "error")
		end
	else
		if not GetRecipe(src, 'heroin', 'fillneedle', 'tier1') then return end
		Log(GetName(src) ..' Filled A Needle Of Heroin!' , 'heroin')
	end
end)



RegisterServerEvent('md-drugs:server:failheroin', function()
	local src = source
    local Player = QBCore.Functions.GetPlayer(src)
	Log(GetName(src) ..' Sucks And Burned Their Heroin', 'heroin')
	if Config.TierSystem then
		local vh = Player.Functions.GetItemByName('heroinvial')
		local vh2 = Player.Functions.GetItemByName('heroinvialstagetwo')
		local vh3 = Player.Functions.GetItemByName('heroinvialstagethree')
		if vh then RemoveItem(src, 'heroinvialstagethree', 1 ) 
		elseif vh2 then RemoveItem(src, 'heroinvialstagetwo', 1) 
		elseif vh3 then RemoveItem(src, 'heroinvial', 1)
		end
	else
		RemoveItem(src, 'heroinvial', 1)
	end
end)

