using System;
using System.Linq;
using System.Threading.Tasks;
using ManagerService.Data;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
namespace ManagerService.Services
{
///
/// Supprime les questions posées au guide IA au-delà de 90 jours.
///
/// Contrairement à , cette purge n'est **pas**
/// conditionnée à un réglage : la durée est un engagement pris dans les CGU (§8.4), pas
/// un paramètre commercial. Un job de conformité qui ne s'exécute pas faute de
/// configuration serait pire que pas de job du tout — il donnerait l'illusion du respect.
/// La clé VisitorQuestions:RetentionDays n'existe que pour raccourcir le délai en
/// recette ; absente, la valeur légale s'applique.
///
/// ⚠️ **Dépendance non satisfaite à ce jour.** Les CGU annoncent que « les regroupements
/// par thème sont conservés au-delà, sous forme agrégée ». Or ThemeId est porté par
/// la ligne VisitorQuestion elle-même : supprimer la ligne supprime aussi l'agrégat.
/// Tant qu'une table d'agrégats distincte n'existe pas, la première purge fera perdre au
/// client tout son historique au 91ᵉ jour. Rien n'est encore collecté, donc le délai n'a
/// pas commencé à courir — mais la table doit exister avant la mise en service.
///
public class VisitorQuestionPurgeService
{
/// Durée annoncée aux visiteurs et aux clients. Voir CGU §8.4.
public const int RetentionDays = 90;
private readonly MyInfoMateDbContext _dbContext;
private readonly IConfiguration _configuration;
private readonly ILogger _logger;
public VisitorQuestionPurgeService(
MyInfoMateDbContext dbContext,
IConfiguration configuration,
ILogger logger)
{
_dbContext = dbContext;
_configuration = configuration;
_logger = logger;
}
public async Task PurgeAsync()
{
var configured = _configuration.GetValue("VisitorQuestions:RetentionDays");
var retentionDays = configured > 0 ? configured : RetentionDays;
var cutoff = DateTime.UtcNow.AddDays(-retentionDays);
var deleted = await _dbContext.VisitorQuestions
.Where(q => q.CreatedAt < cutoff)
.ExecuteDeleteAsync();
if (deleted > 0)
{
_logger.LogInformation(
"Purge RGPD des questions visiteurs : {Deleted} question(s) antérieure(s) au {Cutoff:yyyy-MM-dd} supprimée(s).",
deleted, cutoff);
}
}
}
}