-- laundromat/sv_core.lua
-- Écoute les hooks publics de laundering_system et met à jour les NW2 vars
-- sur la machine correspondante (synchro multi-joueur pour le HUD 3D2D).
--
-- Les hooks Laundering.Started / Laundering.Completed / Laundering.Cancelled
-- sont filtrés par methodId == "laundromat" — pas d'interférence avec le NPC.

Laundromat = Laundromat or {}

-- ============================================================================
-- Helper : vider les NW2 vars d'une machine
-- ============================================================================

local function clearMachineNW2(machine)
    if not IsValid(machine) then return end
    machine:SetNW2Entity("laundromat_user",      NULL)
    machine:SetNW2Float("laundromat_startedAt",  0)
    machine:SetNW2Float("laundromat_endsAt",     0)
    machine:SetNW2Int("laundromat_amount",        0)
end

-- ============================================================================
-- Helper : libérer la machine liée à un joueur
-- ============================================================================

local function clearMachine(ply, methodId)
    if methodId ~= "laundromat" then return end

    local sid = IsValid(ply) and ply:SteamID64() or nil
    if not sid then return end

    local machine = Laundromat._activeMachines[sid]
    clearMachineNW2(machine)
    Laundromat._activeMachines[sid] = nil
end

-- ============================================================================
-- Laundering.Started — positionner les NW2 vars dès le démarrage
-- ============================================================================

hook.Add("Laundering.Started", "Laundromat.OnStarted", function(ply, amount, methodId)
    if methodId ~= "laundromat" then return end
    if not IsValid(ply) then return end

    local sid     = ply:SteamID64()
    local machine = sid and Laundromat._activeMachines[sid]
    if not IsValid(machine) then return end

    local now      = CurTime()
    local duration = Laundromat.Config.Duration or 30

    machine:SetNW2Entity("laundromat_user",      ply)
    machine:SetNW2Float("laundromat_startedAt",  now)
    machine:SetNW2Float("laundromat_endsAt",     now + duration)
    machine:SetNW2Int("laundromat_amount",        math.floor(tonumber(amount) or 0))

    if Laundromat.Config.Logs then
        print(string.format(
            "[Laundromat] Started : ply=%s machine=#%s amount=%d duration=%ds",
            ply:Nick(),
            tostring(machine.LaundromatMachineID or "?"),
            amount,
            duration
        ))
    end
end)

-- ============================================================================
-- Laundering.Completed — libérer la machine
-- ============================================================================

hook.Add("Laundering.Completed", "Laundromat.OnCompleted", function(ply, dirtyIn, cleanOut, isPartial, methodId)
    clearMachine(ply, methodId)

    if Laundromat.Config.Logs and methodId == "laundromat" then
        print(string.format(
            "[Laundromat] Completed : ply=%s dirty=%d clean=%d partial=%s",
            IsValid(ply) and ply:Nick() or "?",
            dirtyIn, cleanOut,
            isPartial and "true" or "false"
        ))
    end
end)

-- ============================================================================
-- Laundering.Cancelled — libérer la machine
-- ============================================================================

hook.Add("Laundering.Cancelled", "Laundromat.OnCancelled", function(ply, amount, reason, methodId)
    clearMachine(ply, methodId)

    if Laundromat.Config.Logs and methodId == "laundromat" then
        print(string.format(
            "[Laundromat] Cancelled : ply=%s amount=%d reason=%s",
            IsValid(ply) and ply:Nick() or "?",
            amount, reason
        ))
    end
end)
