local deathSounds = {
	Sound("vo/npc/male01/pain07.wav"),
	Sound("vo/npc/male01/pain08.wav"),
	Sound("vo/npc/male01/pain09.wav")
}

-- Кастомные спавны по spec_def подразделений
-- Helix ставит позицию игрока внутри хука PlayerLoadout (spawns.lua)
-- Арсенал-плагин вызывает PostPlayerLoadout после полной загрузки персонажа
-- Поэтому перехватываем PostPlayerLoadout чтобы перебить позицию Helix'а

-- Поиск свободной точки рядом с базовой, чтобы игроки не спавнились друг в друге
local function FindClearSpawnPos(basePos)
    -- Сначала проверяем саму базовую точку
    local isClear = true
    for _, ply in ipairs(player.GetAll()) do
        if ply:Alive() and ply:GetPos():DistToSqr(basePos) < 2500 then -- 50^2
            isClear = false
            break
        end
    end
    if isClear then return basePos end

    -- Если занята — ищем свободную позицию по кругу вокруг базовой точки
    local offsets = {60, 120, 180}
    for _, radius in ipairs(offsets) do
        for angle = 0, 315, 45 do
            local rad = math.rad(angle)
            local testPos = basePos + Vector(math.cos(rad) * radius, math.sin(rad) * radius, 0)

            local clear = true
            for _, ply in ipairs(player.GetAll()) do
                if ply:Alive() and ply:GetPos():DistToSqr(testPos) < 2500 then
                    clear = false
                    break
                end
            end

            if clear then return testPos end
        end
    end

    -- Если вообще всё занято — спавним на базовой точке
    return basePos
end

hook.Add("DoPlayerDeath", "YaEbal", function(client, attacker, damageinfo)
	-- Даем другим хукам (MedicMod) возможность сработать
	client:AddDeaths(1)
end)

hook.Add("PlayerDeath", "YaEbal", function(client, inflictor, attacker)
	-- Мы перенесли основную логику в плагин death_screen
	-- Просто логируем смерть

	local character = client:GetCharacter()

	if (character) then
		if (IsValid(client.ixRagdoll)) then
			client.ixRagdoll.ixIgnoreDelete = true
			client:SetLocalVar("blur", nil)

			if (hook.Run("ShouldRemoveRagdollOnDeath", client) != false) then
				client.ixRagdoll:Remove()
			end
		end

--[[
		-- Отправка экрана смерти Murder Drones
		if ix.config.Get("deathScreenEnabled") then
			client.ixDeathTime = RealTime()
			
			local killerName = "Неизвестно"
			if IsValid(attacker) and attacker:IsPlayer() then
				killerName = attacker:GetName()
			elseif IsValid(attacker) then
				killerName = attacker:GetClass()
			end
			
			net.Start("ixDeathScreen")
			net.WriteFloat(RespawnTime[client:GetUserGroup()])
			net.WriteString(killerName)
			net.Send(client)
		end
]]

		-- client:SetNetVar("deathStartTime", CurTime())
		-- client:SetNetVar("deathTime", CurTime() + RespawnTime[client:GetUserGroup()])

		character:SetData("health", nil)

		-- Звук смерти (с учетом настройки экрана смерти)
		if not ix.config.Get("deathScreenDisableSound") then
			local deathSound = hook.Run("GetPlayerDeathSound", client)

			if (deathSound != false) then
				deathSound = deathSound or deathSounds[math.random(1, #deathSounds)]

				if (client:IsFemale() and !deathSound:find("female")) then
					deathSound = deathSound:gsub("male", "female")
				end

				client:EmitSound(deathSound)
			end
		end

		local weapon = IsValid(attacker) and attacker:IsPlayer() and attacker:GetActiveWeapon()
		local attackerName = IsValid(attacker) and (attacker:IsPlayer() and attacker:GetName() or attacker:GetClass()) or "Unknown"

		ix.log.Add(client, "playerDeath", attackerName, IsValid(weapon) and weapon:GetClass())
	end
end)

-- Блокировка возрождения на время показа экрана смерти
hook.Add("PlayerDeathThink", "ixDeathScreenBlock", function(client)
	if ix.config.Get("deathScreenEnabled") then
		local duration = RespawnTime[client:GetUserGroup()] or 60
		if (client.ixDeathTime or 0) + duration > RealTime() then
			return false
		end
	end
end)

-- Ограничение спавна различных элементов из Q-меню только для суперадминов
function Schema:PlayerSpawnSENT(client, class)
	local userGroup = string.lower(client:GetUserGroup() or "user")
	if not (userGroup == "superadmin" or AdminPrivs[userGroup]) then
		client:Notify("Спавн энтити доступен только администрации!")
		return false
	end
end

function Schema:PlayerSpawnSWEP(client, class, info)
	local userGroup = string.lower(client:GetUserGroup() or "user")
	if not (client:IsSuperAdmin() or AdminPrivs[userGroup]) then
        client:Notify("Выдача оружия из Q-меню доступна только администрации!")
		return false
	end
end

function Schema:PlayerSpawnNPC(client, class, weapon)
	local userGroup = string.lower(client:GetUserGroup() or "user")
	if not (client:IsSuperAdmin() or AdminPrivs[userGroup]) then
        client:Notify("Спавн NPC доступен только администрации!")
		return false
	end
end

function Schema:PlayerSpawnVehicle(client, class, name, table)
	local userGroup = string.lower(client:GetUserGroup() or "user")
	if not (client:IsSuperAdmin() or AdminPrivs[userGroup]) then
        client:Notify("Спавн машин из Q-меню доступен только администрации!")
		return false
	end
end

function Schema:PlayerSpawnProp(client, model)
	local userGroup = string.lower(client:GetUserGroup() or "user")
	if (client:IsSuperAdmin() or AdminPrivs[userGroup]) then
		return true
	end

	client:Notify("Спавн пропов доступен только администрации!")
	return false
end
