using Entity; using Microsoft.EntityFrameworkCore; using Shared; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Contextlib { public class DbCharacterManager : ICharacterService { private WTFContext _context; private GenericRepository _repo; private DbImagesManager _dbI; public DbCharacterManager(WTFContext context) { _context = context ?? throw new ArgumentNullException(nameof(context), "Database context cannot be null."); _repo = new GenericRepository(_context); _dbI = new DbImagesManager(context); } /// /// Adds a new character to the database. /// /// The character to be added to the database. /// A task that represents the asynchronous operation. /// Thrown when the provided character is null. public async Task AddCharacter(Character character) { if (character == null) { throw new ArgumentNullException(nameof(character), "character cannot be null."); } var image = await _dbI.GetImageByPath(character.Images.ImgPath); if (image != null) { character.IdImage = image.Id; character.Images = image; } _repo.Insert(character); await _context.SaveChangesAsync(); } /// /// Retrieves all characters from the database and returns them in a paginated format. /// /// A task representing the asynchronous operation, with a as its result containing the full list of characters and pagination information. public async Task> GetAll() { List charLst = _repo.GetItems(0, _repo.Count(), [nameof(Character.Images)]).ToList(); return new PaginationResult(charLst.Count, 0, charLst.Count, charLst); } /// /// Retrieves a character by its ID from the database. /// /// The unique identifier of the character to retrieve. /// A task that represents the asynchronous operation, with a as its result. /// Thrown when no character is found with the given ID. public async Task GetCharById(int id) { Character? character = _repo.GetById(id, item => item.Id == id, nameof(Character.Images)); if (character == null) { throw new KeyNotFoundException($"Error : No character found with the ID: {id}."); } return character; } /// /// Retrieves a character by its name from the database. /// /// The name of the character to retrieve. /// A task that represents the asynchronous operation, with a as its result. /// Thrown when no character is found with the given name. public async Task GetCharByName(string name) { var character = _repo.GetItems(item => item.Name == name,0,1, [nameof(Character.Images)]).FirstOrDefault(); return character; } /// /// Retrieves the highest character ID from the database. /// /// The highest character ID in the database. 0 if there is no character in the database public async Task GetLastCharId() { PaginationResult characters = await GetAll(); int lastCharId = 0; foreach (Character character in characters.items) { if (character.Id >= lastCharId) { lastCharId = character.Id + 1; } } return lastCharId; } public async Task> GetSomeChar(int page, int count) { var charLst = _repo.GetItems(page, count, [nameof(Character.Images)]).ToList(); return new PaginationResult(charLst.Count, 0, charLst.Count, charLst); } /// /// Removes a character from the database by its ID. /// /// The ID of the character to remove. /// A task representing the asynchronous operation. /// Thrown when no character is found with the given ID. public async Task RemoveCharacter(int id) { _repo.Delete(id); await _context.SaveChangesAsync(); } /// /// Updates a character's details by its ID. /// /// The ID of the character to update. /// The updated character information. /// A task representing the asynchronous operation. /// /// Thrown when the provided character is null. /// Thrown when no character is found with the given ID. public async Task UpdateCharacter(int id, Character character) { Character? charac = _repo.GetById(id); if (charac != null) { bool change = false; var image = await _dbI.GetImageByPath(character.Images.ImgPath); if (image != null) { charac.IdImage = image.Id; charac.Images = image; change = true; } if (character.Name != null) { charac.Name = character.Name; change = true; } _repo.Update(charac); if (change) _context.SaveChanges(); } } } }