using Extrudex.Domain.Entities;
using Extrudex.Domain.Enums;
using Extrudex.Domain.Interfaces;
using Extrudex.Infrastructure.Data;
using Microsoft.EntityFrameworkCore;
namespace Extrudex.Infrastructure.Services;
///
/// Implementation of that persists usage entries
/// to the usage_logs table via EF Core.
///
public class UsageLogService : IUsageLogService
{
private readonly ExtrudexDbContext _dbContext;
///
/// Initializes a new instance of the class.
///
/// The EF Core database context for data persistence.
public UsageLogService(ExtrudexDbContext dbContext)
{
_dbContext = dbContext;
}
///
public async Task RecordUsageAsync(
Guid spoolId,
decimal gramsUsed,
DataSource dataSource,
Guid? printerId = null,
Guid? printJobId = null,
decimal? mmExtruded = null,
DateTime? usageTimestamp = null,
string? notes = null)
{
var entry = new UsageLog
{
SpoolId = spoolId,
GramsUsed = gramsUsed,
DataSource = dataSource,
PrinterId = printerId,
PrintJobId = printJobId,
MmExtruded = mmExtruded,
UsageTimestamp = usageTimestamp ?? DateTime.UtcNow,
Notes = notes
};
_dbContext.UsageLogs.Add(entry);
await _dbContext.SaveChangesAsync();
return entry;
}
///
public async Task> GetBySpoolAsync(Guid spoolId, CancellationToken cancellationToken = default)
{
return await _dbContext.UsageLogs
.Where(u => u.SpoolId == spoolId)
.OrderByDescending(u => u.UsageTimestamp)
.ToListAsync(cancellationToken);
}
///
public async Task> GetByPrinterAsync(Guid printerId, CancellationToken cancellationToken = default)
{
return await _dbContext.UsageLogs
.Where(u => u.PrinterId == printerId)
.OrderByDescending(u => u.UsageTimestamp)
.ToListAsync(cancellationToken);
}
///
public async Task> GetByPrintJobAsync(Guid printJobId, CancellationToken cancellationToken = default)
{
return await _dbContext.UsageLogs
.Where(u => u.PrintJobId == printJobId)
.OrderByDescending(u => u.UsageTimestamp)
.ToListAsync(cancellationToken);
}
}