-- armurier/sv_commands.lua
-- Concommands admin console pour la gestion du catalogue.
-- Permission : SuperAdmin in-game ou console RCON (ply == NULL).
--
-- Commandes disponibles :
--   armurier_addcat  <page> <name>
--   armurier_removecat <id>
--   armurier_additem <kind> <page> <category_id> <class> <price> [model]
--   armurier_removeitem <id>
--   armurier_listcat
--   armurier_listitems [page]

Armurier = Armurier or {}

-- ============================================================================
-- Helper : check permission (SuperAdmin ou console RCON)
-- ============================================================================

local function isSuperAdminOrRcon(ply)
    if not IsValid(ply) then return true end  -- console RCON
    return ply:IsSuperAdmin()
end

-- ============================================================================
-- Helper : feedback console + notification client
-- ============================================================================

local function feedback(ply, msg)
    print("[Armurier] " .. tostring(msg))
    if IsValid(ply) then
        DarkRP.notify(ply, 0, 6, tostring(msg))
    end
end

-- ============================================================================
-- armurier_addcat <page> <name>
-- page : weapon | ammo | accessory
-- ============================================================================

concommand.Add("armurier_addcat", function(ply, cmd, args)
    if not isSuperAdminOrRcon(ply) then
        if IsValid(ply) then DarkRP.notify(ply, 4, 4, "Permission refusée.") end
        return
    end

    if #args < 2 then
        feedback(ply, "Usage : armurier_addcat <page> <nom>")
        feedback(ply, "  page : weapon | ammo | accessory")
        return
    end

    local page = args[1]
    -- Le nom peut contenir des espaces (reste des args)
    local name = table.concat(args, " ", 2)

    local id = Armurier.Storage.AddCategory(page, name)
    if id then
        feedback(ply, string.format("Catégorie #%d créée : page=%s name=%s", id, page, name))
    else
        feedback(ply, "Erreur lors de la création de catégorie (voir console serveur).")
    end
end)

-- ============================================================================
-- armurier_removecat <id>
-- ============================================================================

concommand.Add("armurier_removecat", function(ply, cmd, args)
    if not isSuperAdminOrRcon(ply) then
        if IsValid(ply) then DarkRP.notify(ply, 4, 4, "Permission refusée.") end
        return
    end

    local id = tonumber(args[1])
    if not id then
        feedback(ply, "Usage : armurier_removecat <id>")
        return
    end

    local ok = Armurier.Storage.RemoveCategory(id)
    if ok then
        feedback(ply, string.format("Catégorie #%d supprimée (et ses items).", id))
    else
        feedback(ply, "Erreur lors de la suppression (voir console serveur).")
    end
end)

-- ============================================================================
-- armurier_additem <kind> <page> <category_id> <class> <price> [model]
-- ============================================================================

concommand.Add("armurier_additem", function(ply, cmd, args)
    if not isSuperAdminOrRcon(ply) then
        if IsValid(ply) then DarkRP.notify(ply, 4, 4, "Permission refusée.") end
        return
    end

    if #args < 5 then
        feedback(ply, "Usage : armurier_additem <kind> <page> <cat_id> <class> <price> [model]")
        feedback(ply, "  kind : weapon | ammo | accessory")
        return
    end

    local kind       = args[1]
    local page       = args[2]
    local cat_id     = tonumber(args[3])
    local class      = args[4]
    local price      = tonumber(args[5])
    local model      = args[6] or ""

    if not cat_id or not price then
        feedback(ply, "cat_id et price doivent être des entiers.")
        return
    end

    local id = Armurier.Storage.AddItem(kind, page, cat_id, class, model, price)
    if id then
        feedback(ply, string.format("Item #%d ajouté : %s (kind=%s) prix=%d", id, class, kind, price))
    else
        feedback(ply, "Erreur lors de l'ajout (voir console serveur).")
    end
end)

-- ============================================================================
-- armurier_removeitem <id>
-- ============================================================================

concommand.Add("armurier_removeitem", function(ply, cmd, args)
    if not isSuperAdminOrRcon(ply) then
        if IsValid(ply) then DarkRP.notify(ply, 4, 4, "Permission refusée.") end
        return
    end

    local id = tonumber(args[1])
    if not id then
        feedback(ply, "Usage : armurier_removeitem <id>")
        return
    end

    local ok = Armurier.Storage.RemoveItem(id)
    if ok then
        feedback(ply, string.format("Item #%d supprimé.", id))
    else
        feedback(ply, "Erreur lors de la suppression (voir console serveur).")
    end
end)

-- ============================================================================
-- armurier_listcat [page]
-- ============================================================================

concommand.Add("armurier_listcat", function(ply, cmd, args)
    if not isSuperAdminOrRcon(ply) then
        if IsValid(ply) then DarkRP.notify(ply, 4, 4, "Permission refusée.") end
        return
    end

    local filterPage = args[1]  -- optionnel
    local count = 0

    print("[Armurier] === Catégories ===")
    for id, cat in pairs(Armurier._categories) do
        if not filterPage or cat.page == filterPage then
            print(string.format("  #%d  page=%-12s  name=%s", cat.id, cat.page, cat.name))
            count = count + 1
        end
    end
    print(string.format("[Armurier] Total : %d catégorie(s).", count))

    if IsValid(ply) then
        feedback(ply, count .. " catégorie(s) — voir console serveur.")
    end
end)

-- ============================================================================
-- armurier_listitems [page]
-- ============================================================================

concommand.Add("armurier_listitems", function(ply, cmd, args)
    if not isSuperAdminOrRcon(ply) then
        if IsValid(ply) then DarkRP.notify(ply, 4, 4, "Permission refusée.") end
        return
    end

    local filterPage = args[1]
    local count = 0

    print("[Armurier] === Items ===")
    for id, item in pairs(Armurier._items) do
        if not filterPage or item.page == filterPage then
            print(string.format(
                "  #%d  kind=%-10s  page=%-12s  cat=%d  class=%-30s  prix=%d",
                item.id, item.kind, item.page, item.category_id, item.class, item.price
            ))
            count = count + 1
        end
    end
    print(string.format("[Armurier] Total : %d item(s).", count))

    if IsValid(ply) then
        feedback(ply, count .. " item(s) — voir console serveur.")
    end
end)

-- ============================================================================
-- CAISSES (placées par un admin, persistées par map)
-- Note : ces commandes utilisent IsAdmin (pas SuperAdmin) pour rester cohérent
-- avec la pose via spawnmenu AdminOnly.
-- ============================================================================

local function isAdminOrRcon(ply)
    if not IsValid(ply) then return true end  -- console RCON
    return ply:IsAdmin()
end

-- armurier_spawncaisse — pose une caisse là où l'admin vise, et la persiste.
concommand.Add("armurier_spawncaisse", function(ply, cmd, args)
    if not isAdminOrRcon(ply) then
        if IsValid(ply) then DarkRP.notify(ply, 4, 4, "Permission refusée.") end
        return
    end
    if not IsValid(ply) then
        feedback(ply, "Commande à exécuter en jeu (vise un point au sol).")
        return
    end

    local tr  = ply:GetEyeTrace()
    if not tr.Hit then
        feedback(ply, "Visez une surface valide.")
        return
    end

    local pos = tr.HitPos + tr.HitNormal * 5
    local ang = Angle(0, (ply:EyeAngles().y + 180) % 360, 0)

    local ent = Armurier.Caisse.Spawn(pos, ang, nil, true)
    if not IsValid(ent) then
        feedback(ply, "Erreur : impossible de créer la caisse.")
        return
    end

    local id = Armurier.Storage.AddCaisse(game.GetMap(), ent:GetPos(), ent:GetAngles())
    if id then
        ent.armurierDBId = id
        feedback(ply, string.format("Caisse #%d posée et sauvegardée.", id))
    else
        ent.armurierNoDBDelete = true
        ent:Remove()
        feedback(ply, "Erreur lors de la sauvegarde de la caisse (voir console serveur).")
    end
end)

-- armurier_removecaisse — supprime DÉFINITIVEMENT la caisse visée (DB + monde).
concommand.Add("armurier_removecaisse", function(ply, cmd, args)
    if not isAdminOrRcon(ply) then
        if IsValid(ply) then DarkRP.notify(ply, 4, 4, "Permission refusée.") end
        return
    end
    if not IsValid(ply) then
        feedback(ply, "Commande à exécuter en jeu (vise la caisse).")
        return
    end

    local tr  = ply:GetEyeTrace()
    local ent = tr.Entity

    -- Fallback : si la cible visée n'est pas une caisse, prendre la plus proche
    -- dans un rayon de 150u.
    if not (IsValid(ent) and ent:GetClass() == "armurier_caisse") then
        local best, bestSqr = nil, 150 * 150 + 1
        for _, e in ipairs(ents.FindByClass("armurier_caisse")) do
            if IsValid(e) then
                local d = ply:GetPos():DistToSqr(e:GetPos())
                if d < bestSqr then bestSqr = d; best = e end
            end
        end
        ent = best
    end

    if not (IsValid(ent) and ent:GetClass() == "armurier_caisse") then
        feedback(ply, "Aucune caisse visée ni à proximité.")
        return
    end

    local id = ent.armurierDBId
    if id then
        Armurier.Storage.RemoveCaisse(id)
    end
    ent.armurierNoDBDelete = true
    ent:Remove()

    feedback(ply, id and ("Caisse #" .. id .. " supprimée définitivement.")
                     or "Caisse non persistée supprimée.")
end)

-- armurier_listcaisses — liste les caisses persistées de la map courante.
concommand.Add("armurier_listcaisses", function(ply, cmd, args)
    if not isAdminOrRcon(ply) then
        if IsValid(ply) then DarkRP.notify(ply, 4, 4, "Permission refusée.") end
        return
    end

    local rows = Armurier.Storage.LoadCaisses(game.GetMap())
    print("[Armurier] === Caisses (" .. game.GetMap() .. ") ===")
    for _, row in ipairs(rows) do
        print(string.format("  #%d  pos=%s", row.id, tostring(row.pos)))
    end
    print(string.format("[Armurier] Total : %d caisse(s).", #rows))

    if IsValid(ply) then
        feedback(ply, #rows .. " caisse(s) sur cette map — voir console serveur.")
    end
end)
