--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| 	Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]


local PLUGIN = PLUGIN

ITEM.name = "Cigarette"
ITEM.description = "Une simple cigarette contenant du tabac, enroulé dans du papier fin et prête à être fumée.."
ITEM.model = Model("models/willardnetworks/cigarettes/cigarette.mdl")
ITEM.category = "Drogues"
ITEM.width = 1
ITEM.height = 1
ITEM.junkCleanTime = 120

if (CLIENT) then
	function ITEM:PopulateTooltip(tooltip)
        local length = self:GetData("length", 0)

        local panel = tooltip:AddRowAfter("name", "remaining tobacco")
        panel:SetBackgroundColor(derma.GetColor("Warning", tooltip))
        panel:SetText("Tabac restant : "..(math.Round(math.Remap(length, 0, 1, 100, 0), 0)).."%")
        panel:SizeToContents()
	end

	function ITEM:PaintOver(item, w, h)
        local length = item:GetData("length", 0)
        surface.SetDrawColor(length >= 1 and (Color(255, 110, 110, 100)) or (length < 1 and length != 0 and Color(255, 193, 110, 100)) or (Color(110, 255, 110, 100)))
        surface.DrawOutlinedRect(1, 1, w - 2, h - 2)
	end
end

function ITEM:GetModelFlexes()
	return {[0] = self:GetData("length", 0)}
end

function ITEM:CreateCigarette(client)
    if ( SERVER ) then
        PLUGIN:CreateCigarette(self, client)
    end
end

function ITEM:CheckIfModelAllowed(client)
    local faceIndex = client:FindBodygroupByName("face")

    if string.find(client:GetModel(), "models/willardnetworks/citizens/") then
        local headIndex = client:FindBodygroupByName("head")
        if client:GetBodygroup(faceIndex) == 1 or client:GetBodygroup(headIndex) == 4 then
            return false
        end
    end

    if string.find(client:GetModel(), "models/willardnetworks/vortigaunt.mdl") and client:GetBodygroup(faceIndex) == 1 then
        return false
    end

    if string.find(client:GetModel(), "models/wn7new/metropolice/") and client:GetBodygroup(client:FindBodygroupByName("Cp_Head")) > 0 then
        return false
    end

    for _, v in pairs(PLUGIN.allowedModels) do
        if string.find(client:GetModel(), v) then return true end
    end

    return false
end

function ITEM:OnCanRunSmoke()
    local client = self.player

    local length = self:GetData("length", 0)
    if length >= 1 then return false end
    if client and !self:CheckIfModelAllowed(client) then return false end
    if math.Round(math.Remap(length, 0, 1, 100, 0), 0) == 0 then return false end
    if self.entity then return false end
    if client and client.cigarette and IsValid(client.cigarette) then return false end
    if !self.cigaretteEnt then return true end

    return false
end

function ITEM:OnRunSmoke()
    local client = self.player
    if !client then return false end
    if (!client:Alive()) then return false end

    self:CreateCigarette(client)
    client:NotifyLocalized("Vous avez inséré la cigarette dans votre bouche. Utilisez un briquet pour l'allumer.")
end

function ITEM:OnRunStopSmoke(client, value, bRemove)
    client = client or self.player

    if !client then return false end
    if (!client:Alive()) then return false end

    if (value and !bRemove) then
        self:SetData("length", value)
    end

    if IsValid(self.cigaretteEnt) and IsEntity(self.cigaretteEnt) then
        if !value and !bRemove then
            local length = self.cigaretteEnt:GetFlexWeight(self.cigaretteEnt.flexIndexLength)
            self:SetData("length", length)
        end

        self.cigaretteEnt:Remove()
        client.cigarette = nil
    end

    self.cigaretteEnt = nil

    client:NotifyLocalized(self:GetData("length") == 1 and "Vous avez fini de fumer la cigarette, il ne reste que le mégot." or "Vous avez enlevé la cigarette de votre bouche.")

    local itemID = self:GetID()
    if bRemove then
        self:Remove()
    end

    netstream.Start(client, "CigaretteSetClientEntity", itemID, nil, nil)
end

function ITEM:OnCanRunStopSmoke()
    local length = self:GetData("length", 0)
    if length >= 1 then return false end
    if math.Round(math.Remap(length, 0, 1, 100, 0), 0) == 0 then return false end
    if self.cigaretteEnt and IsEntity(self.cigaretteEnt) then return true end
    if self.player and !self:CheckIfModelAllowed(self.player) then return false end

    return false
end

function ITEM:SmokingFinished(client, value)
    self:OnRunStopSmoke(client, value, true)
end

function ITEM:OnTransferred(curInv, inventory)
    local client = self.player
    if client and client.cigarette and IsEntity(client.cigarette) and client.cigarette.cigaretteItem and client.cigarette.cigaretteItem == self then
        self:OnRunStopSmoke()
    end
end

ITEM.functions.smoke = {
    name = "Placez dans la bouche",
	tip = "Placez la cigarette dans votre bouche.",
	icon = "icon16/brick_add.png",
	OnRun = function(item)
        item:OnRunSmoke()

        return false
    end,

    OnCanRun = function(item)
        if item:OnCanRunSmoke() then return true end

        return false
    end
}

ITEM.functions.stopsmoke = {
    name = "Retirer de la bouche",
	tip = "Retirez la cigarette de votre bouche/éteignez-la.",
	icon = "icon16/brick_add.png",
	OnRun = function(item)
        item:OnRunStopSmoke()

        return false
    end,
    OnCanRun = function(item)
        if item:OnCanRunStopSmoke() then return true end

        return false
    end
}

if (CLIENT) then
    netstream.Hook("CigaretteSetClientEntity", function(itemID, entIndex, isLit)
        if itemID and ix.item.instances[itemID] then
            ix.item.instances[itemID].cigaretteEnt = entIndex or nil
        end

        LocalPlayer().cigarette = entIndex or nil

        if !LocalPlayer().cigarette then return end
        LocalPlayer().cigarette.isLit = isLit or nil
    end)
end