-- entities/laundromat_machine/init.lua
-- Comportement serveur de la machine de laverie.
-- Invincible, non-physgun (sauf SuperAdmin), ouvre le menu au USE.
-- 1 joueur à la fois : vérification via NW2 var "laundromat_user".

AddCSLuaFile("shared.lua")
AddCSLuaFile("cl_init.lua")
include("shared.lua")

-- ============================================================================
-- Initialize
-- ============================================================================

function ENT:Initialize()
    local model = (Laundromat and Laundromat.Config and Laundromat.Config.Model)
                  or "models/props_c17/FurnitureWashingmachine001a.mdl"

    self:SetModel(model)
    self:PhysicsInit(SOLID_VPHYSICS)
    self:SetMoveType(MOVETYPE_NONE)
    self:SetSolid(SOLID_VPHYSICS)
    self:SetUseType(SIMPLE_USE)
    self:DropToFloor()

    -- Geler la physique (ne pas tomber, non-poussable)
    local phys = self:GetPhysicsObject()
    if IsValid(phys) then
        phys:EnableMotion(false)
        phys:Sleep()
    end

    -- Initialiser les NW2 vars à vide (état libre)
    self:SetNW2Entity("laundromat_user",     NULL)
    self:SetNW2Float("laundromat_startedAt", 0)
    self:SetNW2Float("laundromat_endsAt",    0)
    self:SetNW2Int("laundromat_amount",       0)
end

-- ============================================================================
-- Invincible
-- ============================================================================

function ENT:OnTakeDamage(dmg)
    return 0
end

-- ============================================================================
-- Physgun : SuperAdmin uniquement
-- ============================================================================

function ENT:PhysgunPickup(ply)
    return IsValid(ply) and ply:IsSuperAdmin()
end

-- ============================================================================
-- Use — ouvre le menu ou notifie machine occupée
-- ============================================================================

function ENT:Use(activator, caller)
    if not IsValid(activator) or not activator:IsPlayer() then return end

    -- Distance check serveur
    local maxDist = (Laundromat and Laundromat.Config and Laundromat.Config.MaxDistance) or 150
    if activator:GetPos():DistToSqr(self:GetPos()) > (maxDist * maxDist) then return end

    -- Vérification machine occupée
    local currentUser = self:GetNW2Entity("laundromat_user")
    if IsValid(currentUser) and currentUser ~= activator then
        DarkRP.notify(activator, 1, 4, "Machine occupée par " .. currentUser:Nick() .. ".")
        return
    end

    -- Whitelist jobs (si configurée)
    local wl = Laundromat and Laundromat.Config and Laundromat.Config.AllowedJobs
    if wl and #wl > 0 then
        local teamName = team.GetName(activator:Team())
        local allowed  = false
        for _, name in ipairs(wl) do
            if name == teamName then allowed = true; break end
        end
        if not allowed then
            DarkRP.notify(activator, 1, 4, "Votre profession ne vous permet pas d'utiliser ce service.")
            return
        end
    end

    -- Envoyer les données au client pour ouvrir le menu
    net.Start("Laundromat.OpenMenu")
        net.WriteEntity(self)
        net.WriteUInt(DirtyMoney.Get(activator), 30)
    net.Send(activator)
end
