-- armurier/cl_net.lua
-- Réception des messages réseau côté client.
-- Délègue l'affichage à cl_ui.lua via Armurier.UI.*

Armurier    = Armurier    or {}
Armurier.UI = Armurier.UI or {}

-- ============================================================================
-- S→C : Armurier.OpenMenu
-- Payload : Entity caisse
-- ============================================================================

net.Receive("Armurier.OpenMenu", function()
    local caisse = net.ReadEntity()

    if Armurier.UI.OpenMenu then
        Armurier.UI.OpenMenu(caisse)
    end
end)

-- ============================================================================
-- S→C : Armurier.CatalogUpdate
-- Payload : String JSON (catalogue complet)
-- Met à jour le cache client et rafraîchit le menu si ouvert.
-- ============================================================================

net.Receive("Armurier.CatalogUpdate", function()
    local json = net.ReadString()
    if not json or json == "" then return end

    local data = util.JSONToTable(json)
    if not data then return end

    -- Reconstituer les tables indexées par id
    local cats  = {}
    local items = {}

    if data.categories then
        for _, cat in ipairs(data.categories) do
            local id = tonumber(cat.id)
            if id then
                cats[id] = {
                    id   = id,
                    page = tostring(cat.page or ""),
                    name = tostring(cat.name or ""),
                }
            end
        end
    end

    if data.items then
        local stockMax = (Armurier and Armurier.Config and Armurier.Config.StockMax) or 10
        for _, item in ipairs(data.items) do
            local id = tonumber(item.id)
            if id then
                items[id] = {
                    id          = id,
                    kind        = tostring(item.kind or ""),
                    page        = tostring(item.page or ""),
                    category_id = tonumber(item.category_id) or 0,
                    class       = tostring(item.class or ""),
                    model       = tostring(item.model or ""),
                    price       = math.floor(tonumber(item.price) or 0),
                    stock       = math.max(0, math.floor(tonumber(item.stock) or stockMax)),
                }
            end
        end
    end

    Armurier.CatalogData = { categories = cats, items = items }

    -- Rafraîchir le menu si ouvert
    if Armurier.UI.RefreshMenu then
        Armurier.UI.RefreshMenu()
    end
end)

-- ============================================================================
-- S→C : Armurier.BuyResult
-- Payload : Bool ok + String msg (128)
-- ============================================================================

net.Receive("Armurier.BuyResult", function()
    local ok  = net.ReadBool()
    local msg = net.ReadString()

    if Armurier.UI.OnBuyResult then
        Armurier.UI.OnBuyResult(ok, msg)
    end
end)
