using Microsoft.EntityFrameworkCore; using SchotzIadKmTracker.Api.Data; using SchotzIadKmTracker.Api.Models.Entities; using SchotzIadKmTracker.Api.Services.Exceptions; namespace SchotzIadKmTracker.Api.Services; /// public class PrecisionDistanceService : IPrecisionDistanceService { // La configuration est un singleton : une seule ligne dont l'identifiant est toujours 1. private const int ParametresId = 1; private readonly AppDbContext _context; public PrecisionDistanceService(AppDbContext context) { _context = context; } /// public async Task ObtenirAsync(CancellationToken cancellationToken = default) { var parametres = await GetOrCreateAsync(cancellationToken); return parametres.PrecisionDistanceKm; } /// public async Task DefinirAsync(int valeur, CancellationToken cancellationToken = default) { if (valeur is not (0 or 1 or 2)) { throw new PrecisionDistanceInvalideException( "La précision des distances doit être 0, 1 ou 2 décimale(s)."); } var parametres = await GetOrCreateAsync(cancellationToken); parametres.PrecisionDistanceKm = valeur; parametres.UpdatedAt = DateTime.UtcNow; await _context.SaveChangesAsync(cancellationToken); return parametres.PrecisionDistanceKm; } /// public decimal ArrondirDistance(decimal distanceBrute, int precision) { var facteur = (decimal)Math.Pow(10, precision); return Math.Ceiling(distanceBrute * facteur) / facteur; } /// /// Récupère la configuration singleton (Id = 1) ou la crée à la volée si elle est absente, /// avec la valeur par défaut (2 décimales). /// private async Task GetOrCreateAsync(CancellationToken cancellationToken) { var parametres = await _context.ParametresApplication .FirstOrDefaultAsync(p => p.Id == ParametresId, cancellationToken); if (parametres is not null) { return parametres; } parametres = new ParametresApplication { Id = ParametresId }; await _context.ParametresApplication.AddAsync(parametres, cancellationToken); await _context.SaveChangesAsync(cancellationToken); return parametres; } }