using Microsoft.EntityFrameworkCore; using Models.Interfaces; using Domain.Entities; using Models.Helpers; using Models.Models; namespace Models.Repositories { public class PhSBusinessUnitRepository(PhronCareOperationsHubContext context) : IPhSBusinessUnitRepository { #region Declaraciones y Constructor private readonly PhronCareOperationsHubContext _context = context; #endregion #region Metodos de clase public async Task> GetAllAsync() { var businessUnits = await _context.PhSBusinessUnits.ToListAsync(); return businessUnits.Select(EntityMapper.MapEntity); } public async Task GetByIdAsync(int id) { var entity = await _context.PhSBusinessUnits.FindAsync(id); return entity is null ? null : EntityMapper.MapEntity(entity); } public async Task> SearchAsync(string term) { var query = _context.PhSBusinessUnits.AsQueryable(); if (!string.IsNullOrWhiteSpace(term)) { term = term.ToLower(); query = query.Where(x => x.Description.ToLower().Contains(term) || x.Code.ToLower().Contains(term) || x.Manager.ToLower().Contains(term)); } var result = await query.ToListAsync(); return result.Select(EntityMapper.MapEntity); } public async Task CreateAsync(EBusinessUnit unit) { if (unit == null) throw new ArgumentNullException(nameof(unit), "La unidad de negocio no puede ser nulo."); try { var businessUnit = EntityMapper.MapEntity(unit); await _context.PhSBusinessUnits.AddAsync(businessUnit); await _context.SaveChangesAsync(); return EntityMapper.MapEntity(businessUnit); } catch (DbUpdateException dbEx) { // Error relacionado con la base de datos (como violación de integridad referencial) throw new Exception("Error al guardar la unidad de negocio en la base de datos. Es posible que haya un problema con la integridad de los datos.", dbEx); } catch (Exception ex) { // Captura cualquier otro tipo de excepción throw new Exception("Error inesperado al crear la unidad de negocio: " + ex.Message, ex); } } public async Task UpdateAsync(EBusinessUnit unit) { if (unit == null) throw new ArgumentNullException(nameof(unit), "La unidad de negocio no puede ser nula."); try { var existingUnit = await _context.PhSBusinessUnits .FirstOrDefaultAsync(c => c.Id == unit.Id); if (existingUnit == null) return false; // Mapea los cambios del modelo EBusinessUnit a la entidad trackeada por EF EntityMapper.MapEntityToExisting(unit, existingUnit); await _context.SaveChangesAsync(); return true; } catch (Exception ex) { return false; } } public async Task DeleteAsync(int id) { var entity = await _context.PhSBusinessUnits.FindAsync(id); if (entity != null) { _context.PhSBusinessUnits.Remove(entity); await _context.SaveChangesAsync(); } return true; } #endregion } }