using Microsoft.EntityFrameworkCore; using SportsDivision.Domain.Entities; using SportsDivision.Domain.Interfaces; using SportsDivision.Infrastructure.Data; namespace SportsDivision.Infrastructure.Repositories; public class StudentRepository : Repository, IStudentRepository { public StudentRepository(ApplicationDbContext context) : base(context) { } public async Task GetByExistingIdAsync(string existingStudentId) => await _dbSet.Include(s => s.School).FirstOrDefaultAsync(s => s.ExistingStudentId == existingStudentId); public async Task> GetBySchoolAsync(int schoolId) => await _dbSet.Where(s => s.SchoolId == schoolId).Include(s => s.School).OrderBy(s => s.LastName).ThenBy(s => s.FirstName).ToListAsync(); public async Task GetWithRegistrationsAsync(int studentId) => await _dbSet.Include(s => s.School).Include(s => s.Registrations).ThenInclude(r => r.TournamentEventLevel).ThenInclude(t => t.Event).Include(s => s.Registrations).ThenInclude(r => r.TournamentEventLevel).ThenInclude(t => t.EventLevel).FirstOrDefaultAsync(s => s.StudentId == studentId); public async Task<(IReadOnlyList Items, int TotalCount)> GetPagedAsync(int? schoolId, string? searchTerm, int page, int pageSize) { IQueryable query = _dbSet.Include(s => s.School); if (schoolId.HasValue) query = query.Where(s => s.SchoolId == schoolId.Value); if (!string.IsNullOrWhiteSpace(searchTerm)) query = query.Where(s => s.FirstName.Contains(searchTerm) || s.LastName.Contains(searchTerm) || (s.ExistingStudentId != null && s.ExistingStudentId.Contains(searchTerm))); var total = await query.CountAsync(); query = query.OrderBy(s => s.LastName).ThenBy(s => s.FirstName); if (pageSize > 0) query = query.Skip((page - 1) * pageSize).Take(pageSize); return (await query.ToListAsync(), total); } }