-- armurier/sh_api.lua
-- Namespace partagé Armurier.
-- Coté serveur : cache mémoire du catalogue (categories + items).
-- Coté client  : cache reçu via net (Armurier.CatalogData).
-- Les fonctions publiques de la vraie logique sont dans sv_storage.lua (serveur)
-- et utilisées depuis sv_net.lua. Ce fichier expose l'interface publique
-- utilisable par d'autres addons (serveur uniquement pour les écritures).

Armurier = Armurier or {}

-- ============================================================================
-- SERVEUR : structures internes
-- ============================================================================

if SERVER then
    -- Cache catalogue en mémoire
    -- { id = { id, page, name } }
    Armurier._categories = Armurier._categories or {}

    -- { id = { id, kind, page, category_id, class, model, price } }
    Armurier._items = Armurier._items or {}

    -- -----------------------------------------------------------------------
    -- API publique : GetCatalog
    -- Retourne les deux tables du cache.
    -- -----------------------------------------------------------------------
    function Armurier.GetCatalog()
        return Armurier._categories, Armurier._items
    end

    -- -----------------------------------------------------------------------
    -- API publique : AddCategory(page, name)
    -- page : "weapon" | "ammo" | "accessory"
    -- name : string <= 64 chars
    -- Retourne id (int) ou nil sur erreur.
    -- Utilise sv_storage.lua (définie plus tard dans l'ordre de chargement).
    -- -----------------------------------------------------------------------
    function Armurier.AddCategory(page, name)
        if not Armurier.Storage then
            ErrorNoHalt("[Armurier] Storage non initialisé.\n")
            return nil
        end
        return Armurier.Storage.AddCategory(page, name)
    end

    -- -----------------------------------------------------------------------
    -- API publique : RemoveCategory(id)
    -- -----------------------------------------------------------------------
    function Armurier.RemoveCategory(id)
        if not Armurier.Storage then
            ErrorNoHalt("[Armurier] Storage non initialisé.\n")
            return false
        end
        return Armurier.Storage.RemoveCategory(id)
    end

    -- -----------------------------------------------------------------------
    -- API publique : AddItem(kind, page, category_id, class, model, price)
    -- kind  : "weapon" | "ammo" | "accessory"
    -- class : classe SWEP ou SENT
    -- model : WorldModel (déduit automatiquement si vide)
    -- price : entier positif
    -- Retourne id (int) ou nil sur erreur.
    -- -----------------------------------------------------------------------
    function Armurier.AddItem(kind, page, category_id, class, model, price)
        if not Armurier.Storage then
            ErrorNoHalt("[Armurier] Storage non initialisé.\n")
            return nil
        end
        return Armurier.Storage.AddItem(kind, page, category_id, class, model, price)
    end

    -- -----------------------------------------------------------------------
    -- API publique : RemoveItem(id)
    -- -----------------------------------------------------------------------
    function Armurier.RemoveItem(id)
        if not Armurier.Storage then
            ErrorNoHalt("[Armurier] Storage non initialisé.\n")
            return false
        end
        return Armurier.Storage.RemoveItem(id)
    end
end

-- ============================================================================
-- CLIENT : cache catalogue reçu par net
-- ============================================================================

if CLIENT then
    -- Données reçues du serveur : { categories = {...}, items = {...} }
    Armurier.CatalogData = Armurier.CatalogData or { categories = {}, items = {} }
end
