using Marathon.Application.Abstractions; using Marathon.Domain.Entities; using Marathon.Domain.Enums; using Microsoft.EntityFrameworkCore; namespace Marathon.Infrastructure.Persistence.Repositories; internal sealed class PaperBetRepository : IPaperBetRepository { private readonly MarathonDbContext _db; public PaperBetRepository(MarathonDbContext db) => _db = db; public async Task GetAsync(Guid key, CancellationToken ct = default) { var idStr = key.ToString(); var entity = await _db.PaperBets.AsNoTracking() .FirstOrDefaultAsync(b => b.Id == idStr, ct); return entity is null ? null : Mapping.ToDomain(entity); } public async Task> ListAsync(CancellationToken ct = default) { var entities = await _db.PaperBets.AsNoTracking() .OrderByDescending(b => b.OpenedAt) .ToListAsync(ct); return entities.Select(Mapping.ToDomain).ToList().AsReadOnly(); } public async Task> ListByOutcomeAsync(BetOutcome outcome, CancellationToken ct = default) { var outcomeInt = (int)outcome; var entities = await _db.PaperBets.AsNoTracking() .Where(b => b.Outcome == outcomeInt) .ToListAsync(ct); return entities.Select(Mapping.ToDomain).ToList().AsReadOnly(); } public async Task> GetExistingAnomalyIdsAsync( IReadOnlyCollection anomalyIds, CancellationToken ct = default) { if (anomalyIds.Count == 0) return new HashSet(); var idStrings = anomalyIds.Select(id => id.ToString()).ToList(); var existing = await _db.PaperBets.AsNoTracking() .Where(b => idStrings.Contains(b.AnomalyId)) .Select(b => b.AnomalyId) .ToListAsync(ct); return existing.Select(Guid.Parse).ToHashSet(); } public async Task AddAsync(PaperBet entity, CancellationToken ct = default) { var efEntity = Mapping.ToEntity(entity); await _db.PaperBets.AddAsync(efEntity, ct); } public Task UpdateAsync(PaperBet entity, CancellationToken ct = default) { var efEntity = Mapping.ToEntity(entity); _db.PaperBets.Update(efEntity); return Task.CompletedTask; } public async Task DeleteAsync(Guid key, CancellationToken ct = default) { var idStr = key.ToString(); var entity = await _db.PaperBets.FirstOrDefaultAsync(b => b.Id == idStr, ct); if (entity is not null) _db.PaperBets.Remove(entity); } public async Task SaveChangesAsync(CancellationToken ct = default) => await _db.SaveChangesAsync(ct); }