using PetCompanion.Models; using PetCompanion.Repositories; namespace PetCompanion.Services { public class PetInventoryService { private readonly PetInventoryRepository petInventoryRepository; private readonly PetRepository petRepository; private readonly GameItemsRepository gameItemsRepository; private readonly GameItemService gameItemService; public PetInventoryService( PetInventoryRepository petInventoryRepository, PetRepository petRepository, GameItemsRepository gameItemsRepository, GameItemService gameItemService) { this.petInventoryRepository = petInventoryRepository; this.petRepository = petRepository; this.gameItemsRepository = gameItemsRepository; this.gameItemService = gameItemService; } public Inventory GetInventory(string petId, string userId) { var pet = petRepository.GetPetById(petId, userId); if (pet == null) throw new Exception("Pet not found"); return petInventoryRepository.GetPetInventory(petId); } public Inventory CreateInventory(string petId) { var inventory = new Inventory { PetId = petId, Capacity = 20, Items = new List() }; petInventoryRepository.SavePetInventory(inventory); return inventory; } public Pet UseItem(string petId, string userId, int itemId) { var pet = petRepository.GetPetById(petId, userId); if (pet == null) throw new Exception("Pet not found"); if (!pet.Inventory.Items.Any(i => i == itemId)) throw new Exception("Item not found in inventory"); var gameItem = gameItemsRepository.GetById(itemId); gameItemService.ApplyItemEffect(pet, gameItem); pet.Inventory.Items.Remove(itemId); return petRepository.UpdatePet(pet); } public Pet EquipItem(string petId, string userId, int itemId) { var pet = petRepository.GetPetById(petId, userId); if (pet == null) throw new Exception("Pet not found"); if (!pet.Inventory.Items.Any(i => i == itemId)) throw new Exception("Item not found in inventory"); var gameItem = gameItemsRepository.GetById(itemId); if (gameItem.Type != ItemType.Equipment) throw new Exception("Item is not equipment"); // If there's already an item equipped in that slot, unequip it first if (pet.EquippedItems.ContainsKey(gameItem.EquipTarget)) { var equippedItemId = pet.EquippedItems[gameItem.EquipTarget]; UnequipItem(petId, userId, equippedItemId); } // Apply equipment effects gameItemService.ApplyItemEffect(pet, gameItem); // Mark item as equipped pet.EquippedItems[gameItem.EquipTarget] = itemId; // Remove from inventory pet.Inventory.Items.Remove(itemId); petInventoryRepository.UpdateEquippedItems(petId, pet.EquippedItems); return petRepository.UpdatePet(pet); } public Pet UnequipItem(string petId, string userId, int itemId) { var pet = petRepository.GetPetById(petId, userId); if (pet == null) throw new Exception("Pet not found"); var equipTarget = pet.EquippedItems.FirstOrDefault(kvp => kvp.Value == itemId).Key; if (equipTarget == ItemEquipTarget.None) throw new Exception("No item equipped in that slot"); var equippedItem = gameItemsRepository.GetById(itemId); if (equippedItem != null) { // Remove equipment effects gameItemService.RemoveItemEffect(pet, equippedItem); // Add item back to inventory pet.Inventory.Items.Add(itemId); } pet.EquippedItems.Remove(equipTarget); return petRepository.UpdatePet(pet); } public Pet DropItem(string petId, string userId, int itemId) { var pet = petRepository.GetPetById(petId, userId); if (!pet.Inventory.Items.Any(i => i == itemId)) throw new Exception("Item not found in inventory"); var gameItem = gameItemsRepository.GetById(itemId); pet.Inventory.Items.Remove(itemId); return petRepository.UpdatePet(pet); } public Pet AddItemToPet(string petId, string userId, int itemId, int quantity) { var pet = petRepository.GetPetById(petId, userId); var gameItem = gameItemsRepository.GetById(itemId); if (gameItem == null) throw new Exception("Item not found"); for (int i = 0; i < quantity; i++) { pet.Inventory.Items.Add(itemId); } return petRepository.UpdatePet(pet); } } }