local PLUGIN = PLUGIN

util.AddNetworkString("ixShop_OpenMenu")
util.AddNetworkString("ixShop_BuyItem")
util.AddNetworkString("ixShop_UpdateModel")
util.AddNetworkString("ixShop_UpdateType")

ix.util.Include("sh_config.lua")

function PLUGIN:SaveData()
	local data = {}
	
	for _, npc in ipairs(ents.FindByClass("ix_shop_npc")) do
		if IsValid(npc) then
			data[#data + 1] = {
				pos = npc:GetPos(),
				angles = npc:GetAngles(),
				model = npc:GetModel(),
				shopType = npc:GetShopType()
			}
		end
	end
	
	self:SetData(data)
end

function PLUGIN:LoadData()
	for _, v in ipairs(self:GetData() or {}) do
		local npc = ents.Create("ix_shop_npc")
		if IsValid(npc) then
			npc:SetPos(v.pos)
			npc:SetAngles(v.angles)
			npc:SetModel(v.model or "models/humans/group01/male_01.mdl")
			npc:Spawn()
			
			timer.Simple(0.1, function()
				if IsValid(npc) then
					npc:SetShopType(v.shopType or "general")
				end
			end)
		end
	end
end

function PLUGIN:OnUnloaded()
	self:SaveData()
end

-- Обработка изменения типа магазина
net.Receive("ixShop_UpdateType", function(len, client)
	if not client:IsAdmin() then return end
	
	local npc = net.ReadEntity()
	local shopType = net.ReadString()
	
	if not IsValid(npc) or npc:GetClass() != "ix_shop_npc" then return end
	if client:GetPos():Distance(npc:GetPos()) > 300 then return end
	
	npc:SetShopType(shopType)
	PLUGIN:SaveData()
	
	client:Notify("Тип магазина изменен на: " .. shopType)
end)

-- Обработка покупки предмета
net.Receive("ixShop_BuyItem", function(len, client)
	local shopType = net.ReadString()
	local itemID = net.ReadString()
	
	local shopData = PLUGIN.shops[shopType]
	if not shopData or not shopData.items[itemID] then
		client:Notify("Предмет не найден!")
		return
	end
	
	local itemData = shopData.items[itemID]
	local character = client:GetCharacter()
	
	if not character then return end
	
	-- Проверка денег
	if not character:HasMoney(itemData.price) then
		client:Notify("Недостаточно денег! Требуется: " .. itemData.price .. "₽")
		return
	end
	
	-- Проверка наличия предмета в базе ix.item
	local ixItem = ix.item.list[itemID]
	if not ixItem then
		client:Notify("Предмет не существует в базе данных!")
		return
	end
	
	-- Попытка дать предмет
	if shopType == "drones" then
		local weaponClass = ixItem.class or itemID

		-- Проверка, нет ли уже такого дрона у игрока
		if client:HasWeapon(weaponClass) then
			client:Notify("У вас уже есть этот дрон!")
			return
		end

		-- Если это магазин дронов, даем оружие напрямую (SWEP)
		client:Give(weaponClass)
		client:SelectWeapon(weaponClass)
	else
		-- Для остальных магазинов добавляем в инвентарь
		local inventory = character:GetInventory()

		if not inventory or isnumber(inventory) then
			client:Notify("Инвентарь еще загружается, подождите немного...")
			return
		end

		if not inventory:Add(itemID) then
			client:Notify("Недостаточно места в инвентаре!")
			return
		end
	end
	
	-- Списание денег
	character:TakeMoney(itemData.price)
	client:Notify("Вы купили " .. (ixItem.name or itemID) .. " за " .. itemData.price .. "₽")
	
	-- Логирование покупки
	local serverlogsPlugin = ix.plugin.list["serverlogs"]
	if serverlogsPlugin then
		local message = string.format("%s купил %s за %d₽ (магазин: %s)", 
			client:GetName(), (ixItem.name or itemID), itemData.price, shopData.name)
		serverlogsPlugin:AddLog("SHOP_PURCHASE", message, client, {
			itemID = itemID,
			itemName = (ixItem.name or itemID),
			price = itemData.price,
			shopType = shopType
		})
	end
end)

-- Обработка изменения модели NPC
net.Receive("ixShop_UpdateModel", function(len, client)
	if not client:IsAdmin() then return end
	
	local npc = net.ReadEntity()
	local model = net.ReadString()
	
	if not IsValid(npc) or npc:GetClass() != "ix_shop_npc" then return end
	if client:GetPos():Distance(npc:GetPos()) > 300 then return end
	
	npc:SetModel(model)
	PLUGIN:SaveData()
	
	client:Notify("Модель NPC изменена на: " .. model)
end)

-- Команда для сохранения магазинов
ix.command.Add("ShopSave", {
	description = "Сохранить все магазины",
	superAdminOnly = true,
	OnRun = function(self, client)
		local plugin = ix.plugin.Get("shop")
		if not plugin then
			return "@commandNoExist"
		end
		
		plugin:SaveData()
		local count = #ents.FindByClass("ix_shop_npc")
		client:Notify("Магазины сохранены (" .. count .. " шт.)")
	end
})
