-- entities/armurier_caisse/init.lua
-- Comportement serveur de la caisse d'armurier.
-- • Invincible, non-physgun (sauf SuperAdmin)
-- • Use → vérifie job Armurier + distance + envoie OpenMenu au client
-- • NW2 "armurier_owner" : référence au joueur propriétaire de la caisse

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

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

function ENT:Initialize()
    local model = (Armurier and Armurier.Config and Armurier.Config.Model)
                  or "models/Items/ammocrate_smg1.mdl"

    self:SetModel(model)
    self:PhysicsInit(SOLID_VPHYSICS)
    self:SetMoveType(MOVETYPE_VPHYSICS)
    self:SetSolid(SOLID_VPHYSICS)
    self:SetUseType(SIMPLE_USE)
    -- Pas de DropToFloor ici : les caisses restaurées doivent garder la position
    -- exacte sauvegardée en DB. Le placement manuel (commande) gère son propre
    -- DropToFloor via Armurier.Caisse.Spawn(..., drop = true).

    -- Geler la physique
    local phys = self:GetPhysicsObject()
    if IsValid(phys) then
        phys:EnableMotion(false)
        phys:Sleep()
    end

    -- Pas de propriétaire par défaut
    self:SetNW2Entity("armurier_owner", NULL)

    -- Nom de boutique (mis à jour après RestoreAll ou SetCaisseName)
    self:SetNW2String("armurier_name", "")
end

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

function ENT:OnTakeDamage(dmg)
    return 0
end

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

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

-- ============================================================================
-- Use — vérifie job + distance, puis envoie le signal au client
-- ============================================================================

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

    -- Vérification job Armurier
    if not TEAM_ARMURIER or activator:Team() ~= TEAM_ARMURIER then
        DarkRP.notify(activator, 1, 4, "Seul l'Armurier peut utiliser cette caisse.")
        return
    end

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

    -- Anti-spam ouverture menu
    if (activator.armurierNextMenu or 0) + ((Armurier and Armurier.Config and Armurier.Config.RateMenu) or 1.0) > CurTime() then
        return
    end
    activator.armurierNextMenu = CurTime()

    -- Envoyer signal au client pour ouvrir le menu
    net.Start("Armurier.OpenMenu")
        net.WriteEntity(self)
    net.Send(activator)
end

-- ============================================================================
-- OnRemove — nettoyer la NW2 var
-- ============================================================================

function ENT:OnRemove()
    self:SetNW2Entity("armurier_owner", NULL)
end
