local PLUGIN = PLUGIN

-- Конфигурационные переменные
ix.config.Add("dynamicHeightEnabled", true, "Включить динамическую высоту камеры.", nil, {
	category = "Динамическая высота"
})

ix.config.Add("dynamicHeightMaxManual", false, "Использовать ручную максимальную высоту.", nil, {
	category = "Динамическая высота"
})

ix.config.Add("dynamicHeightMinManual", false, "Использовать ручную минимальную высоту.", nil, {
	category = "Динамическая высота"
})

ix.config.Add("dynamicHeightMin", 16, "Минимальная высота камеры (присед).", nil, {
	data = {min = 5, max = 180},
	category = "Динамическая высота"
})

ix.config.Add("dynamicHeightMax", 64, "Максимальная высота камеры (стоя).", nil, {
	data = {min = 5, max = 180},
	category = "Динамическая высота"
})

local function UpdateView(ply)
	if not ix.config.Get("dynamicHeightEnabled", true) then
		if ply.ixDynamicHeightChanged then
			ply:SetViewOffset(Vector(0, 0, 64))
			ply:SetViewOffsetDucked(Vector(0, 0, 28))
			ply.ixDynamicHeightChanged = nil
		end
		return
	end

	-- Определяем высоту модели
	local height_max = 64
	local height_min = 16

	-- Создаем временную сущность для измерения высоты стоя
	local entity = ents.Create("base_anim")
	entity:SetModel(ply:GetModel())
	entity:ResetSequence(entity:LookupSequence("idle_all_01"))
	local bone = entity:LookupBone("ValveBiped.Bip01_Neck1")
	if bone then
		height_max = entity:GetBonePosition(bone).z + 5
	end

	-- Создаем временную сущность для измерения высоты приседа
	local entity2 = ents.Create("base_anim")
	entity2:SetModel(ply:GetModel())
	entity2:ResetSequence(entity2:LookupSequence("cidle_all"))
	local bone2 = entity2:LookupBone("ValveBiped.Bip01_Neck1")
	if bone2 then
		height_min = entity2:GetBonePosition(bone2).z + 5
	end

	-- Удаляем временные сущности
	entity:Remove()
	entity2:Remove()

	-- Применяем настройки высоты
	local min = ix.config.Get("dynamicHeightMin", 16)
	local max = ix.config.Get("dynamicHeightMax", 64)

	if ix.config.Get("dynamicHeightMinManual", false) then
		ply:SetViewOffsetDucked(Vector(0, 0, min))
	else
		ply:SetViewOffsetDucked(Vector(0, 0, height_min))
	end

	if ix.config.Get("dynamicHeightMaxManual", false) then
		ply:SetViewOffset(Vector(0, 0, max))
	else
		ply:SetViewOffset(Vector(0, 0, height_max))
	end

	ply.ixDynamicHeightChanged = true
end

local function UpdateTrueModel(ply)
	if ply:GetNWString("ixDynamicHeight:TrueModel") ~= ply:GetModel() then
		ply:SetNWString("ixDynamicHeight:TrueModel", ply:GetModel())
		UpdateView(ply)
	end
end

function PLUGIN:PlayerSpawn(ply)
	UpdateTrueModel(ply)
end

function PLUGIN:PlayerTick(ply)
	UpdateTrueModel(ply)
end

-- Обновление при изменении конфигов
local function OnConfigChanged(key, oldValue, newValue)
	if string.StartWith(key, "dynamicHeight") then
		for _, ply in pairs(player.GetAll()) do
			UpdateView(ply)
		end
	end
end

function PLUGIN:OnConfigChanged(key, oldValue, newValue)
	if key == "dynamicHeightEnabled" or 
	   key == "dynamicHeightMin" or 
	   key == "dynamicHeightMax" or 
	   key == "dynamicHeightMinManual" or 
	   key == "dynamicHeightMaxManual" then
		OnConfigChanged(key, oldValue, newValue)
	end
end
