AddCSLuaFile()

ENT.Type = "anim"
ENT.Base = "base_gmodentity"
ENT.PrintName = "Ящик с патронами"
ENT.Author = "Server"
ENT.Spawnable = true
ENT.AdminOnly = true
ENT.Category = "[FT] Система арсенала"
ENT.bNoPersist = true

if SERVER then
    function ENT:Initialize()
        self:SetModel("models/trenches/prop/para_ammo/ammo_supply.mdl")
        self:PhysicsInit(SOLID_VPHYSICS)
        self:SetMoveType(MOVETYPE_VPHYSICS)
        self:SetSolid(SOLID_VPHYSICS)
        
        local phys = self:GetPhysicsObject()
        if IsValid(phys) then 
            phys:Wake() 
        end
        
        -- Таблица для хранения кулдаунов игроков
        self.playerCooldowns = {}
    end

    -- Получить информацию о патронах для оружия
    function ENT:GetWeaponAmmoInfo(weapon)
        if not IsValid(weapon) then return nil end
        
        local ammoType = weapon:GetPrimaryAmmoType()
        if ammoType == -1 then return nil end
        
        local clipSize = weapon:GetMaxClip1()
        if clipSize <= 0 then return nil end
        
        return {
            ammoType = ammoType,
            clipSize = clipSize,
            ammoName = game.GetAmmoName(ammoType) or "unknown"
        }
    end

    -- Использование ящика
    function ENT:Use(activator, caller)
        if not IsValid(activator) or not activator:IsPlayer() then return end
        
        -- Проверка кулдауна (1 секунда)
        local steamID = activator:SteamID()
        local now = CurTime()
        if self.playerCooldowns[steamID] and (now - self.playerCooldowns[steamID]) < 1 then
            return
        end
        
        local char = activator:GetCharacter()
        if not char then 
            activator:Notify("У вас нет активного персонажа")
            return 
        end

        local plugin = ix.plugin.list and ix.plugin.list["arsenal"]
        if not plugin then 
            activator:Notify("Плагин арсенала не найден")
            return 
        end

        -- Проверка оружия в руках
        local weapon = activator:GetActiveWeapon()
        if not IsValid(weapon) then
            activator:Notify("Возьмите оружие в руки")
            return
        end

        -- Получение информации о патронах
        local ammoInfo = self:GetWeaponAmmoInfo(weapon)
        local isMedicalKit = weapon:GetClass() == "tacrp_ifak"
        
        if not ammoInfo and not isMedicalKit then
            activator:Notify("Это оружие не использует патроны")
            return
        end

        -- Специальная логика для медицинской аптечки IFAK
        if isMedicalKit then
            -- Проверяем текущие запасы медицинских расходников
            local bandages = activator:GetAmmoCount(game.GetAmmoID("Bandages"))
            local quikclots = activator:GetAmmoCount(game.GetAmmoID("Quikclots"))
            local hemostats = activator:GetAmmoCount(game.GetAmmoID("Hemostats"))
            
            local maxBandages = 4
            local maxQuikclots = 3
            local maxHemostats = 2
            
            if bandages >= maxBandages and quikclots >= maxQuikclots and hemostats >= maxHemostats then
                activator:Notify("У вас уже полный комплект медицинских расходников")
                return
            end
            
            -- Рассчитываем стоимость пополнения
            local costPerItem = 5 -- стоимость за единицу
            local totalCost = 0
            local itemsToGive = {}
            
            if bandages < maxBandages then
                local needed = maxBandages - bandages
                totalCost = totalCost + needed * costPerItem
                itemsToGive["Bandages"] = needed
            end
            
            if quikclots < maxQuikclots then
                local needed = maxQuikclots - quikclots
                totalCost = totalCost + needed * costPerItem
                itemsToGive["Quikclots"] = needed
            end
            
            if hemostats < maxHemostats then
                local needed = maxHemostats - hemostats
                totalCost = totalCost + needed * costPerItem
                itemsToGive["Hemostats"] = needed
            end
            
            -- Проверка достаточно ли очков снабжения
            if supply < totalCost then
                activator:Notify(string.format("Недостаточно очков снабжения. Требуется: %d, доступно: %d", totalCost, supply))
                return
            end
            
            -- Выдаем расходники
            for ammoType, amount in pairs(itemsToGive) do
                activator:GiveAmmo(amount, ammoType, true)
            end
            
            -- Списываем очки снабжения
            plugin:AddFactionSupply(factionID, -totalCost)
            
            -- Устанавливаем кулдаун
            self.playerCooldowns[steamID] = now
            
            -- Уведомление
            local itemList = {}
            for ammoType, amount in pairs(itemsToGive) do
                table.insert(itemList, string.format("%s: +%d", ammoType, amount))
            end
            activator:Notify(string.format("Получены медицинские расходники: %s", table.concat(itemList, ", ")))
            
            -- Звуковой эффект
            self:EmitSound("items/ammo_pickup.wav")
            
            -- Логирование
            print(string.format("[AMMOBOX] %s получил медицинские расходники. Стоимость: %d очков", 
                activator:Nick(), totalCost))
            return
        end

        -- Проверяем конфиг арсенала для этого оружия (одноразовые гранатомёты)
        local weaponClass = weapon:GetClass()
        local arsenalConfig = plugin.config and plugin.config.weapons and plugin.config.weapons[weaponClass]
        -- Детект по конфигу ИЛИ по типу патронов — rpg_round и PanzerFaust3 Rocket всегда одноразовые
        local launcherAmmoTypes = { ["rpg_round"] = true, ["PanzerFaust3 Rocket"] = true }
        local isOneShotLauncher = (arsenalConfig and (arsenalConfig.maxAmmo == 1 or arsenalConfig.maxCount == 1))
            or launcherAmmoTypes[ammoInfo.ammoName]

        -- Проверка фракции
        local factionID = char:GetFaction()
        local supply = plugin:GetFactionSupply(factionID)
        supply = tonumber(supply) or 0

        if isOneShotLauncher then
            -- Одноразовый гранатомёт: max 1 снаряд в запасе
            local currentAmmo = activator:GetAmmoCount(ammoInfo.ammoType)
            if currentAmmo >= 1 then
                activator:Notify("У вас уже есть снаряд для этого оружия")
                return
            end

            -- Стоимость 1 снаряда через costPerBullet
            local totalCost = 1
            if supply < totalCost then
                activator:Notify(string.format("Недостаточно очков снабжения. Требуется: %d, доступно: %d", totalCost, supply))
                return
            end

            -- Выдаём ровно 1 снаряд через SetAmmo (GiveAmmo выдаёт минимум 6 для rpg_round)
            activator:SetAmmo(currentAmmo + 1, ammoInfo.ammoType)
            plugin:AddFactionSupply(factionID, -totalCost)
            self.playerCooldowns[steamID] = now

            activator:Notify("Получен 1 снаряд")
            self:EmitSound("items/ammo_pickup.wav")
        else
            -- Обычное оружие: проверка реального количества патронов у игрока
            local currentAmmo = activator:GetAmmoCount(ammoInfo.ammoType)
            local maxAllowedAmmo = ammoInfo.clipSize * 6 -- 6 магазинов запаса

            if currentAmmo >= maxAllowedAmmo then
                local currentMags = math.floor(currentAmmo / ammoInfo.clipSize)
                activator:Notify(string.format("У вас уже максимум патронов (%d магазинов, 6/6)", currentMags))
                return
            end

            -- Рассчитываем количество патронов (1 магазин)
            local totalAmmo = ammoInfo.clipSize
            local costPerBullet = 1
            local totalCost = totalAmmo * costPerBullet

            if supply < totalCost then
                activator:Notify(string.format("Недостаточно очков снабжения. Требуется: %d, доступно: %d", totalCost, supply))
                return
            end

            -- Выдаем патроны
            activator:GiveAmmo(totalAmmo, ammoInfo.ammoType, true)
            plugin:AddFactionSupply(factionID, -totalCost)
            self.playerCooldowns[steamID] = now

            -- Подсчёт текущих магазинов после выдачи
            local newAmmo = activator:GetAmmoCount(ammoInfo.ammoType)
            local newMags = math.floor(newAmmo / ammoInfo.clipSize)
            local magsStr = math.min(newMags, 6) .. "/6"
            activator:Notify(string.format("Получено %d %s (магазинов: %s)", totalAmmo,
                totalAmmo == 1 and "патрон" or (totalAmmo < 5 and "патрона" or "патронов"), magsStr))
            self:EmitSound("items/ammo_pickup.wav")
        end
    end
end

if CLIENT then
    function ENT:Draw()
        self:DrawModel()
    end
end

    
