using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;

namespace TeleWave.Infrastructure.Media;

/// <summary>
/// Расписание уборки <c>uploads/</c> (сама уборка — <see cref="UploadsCleaner"/>): проход на старте
/// и раз в час. Удаление недописанного файла на месте
/// (<see cref="FileSystemMediaStorage.SaveUploadAsync"/>) закрывает штатные обрывы, этот сервис —
/// страховка от аварийного рестарта посреди заливки.
/// </summary>
public sealed class UploadsCleanupBackgroundService(
    MediaPathResolver paths,
    IOptions<StorageOptions> options,
    ILogger<UploadsCleanupBackgroundService> logger
) : BackgroundService
{
    /// <summary>Как часто заглядывать в каталог. Порог измеряется часами — чаще незачем.</summary>
    private static readonly TimeSpan Period = TimeSpan.FromHours(1);

    private readonly StorageOptions _storage = options.Value;

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        if (_storage.StaleUploadHours <= 0)
        {
            logger.LogInformation("Уборка uploads/ выключена (Storage:StaleUploadHours = 0).");
            return;
        }

        var retention = TimeSpan.FromHours(_storage.StaleUploadHours);
        paths.EnsureDirectories();

        // Первый проход сразу: после аварийного рестарта недописанное лежит с прошлого запуска.
        UploadsCleaner.Sweep(paths, retention, logger);

        using var timer = new PeriodicTimer(Period);
        while (await timer.WaitForNextTickAsync(stoppingToken))
            UploadsCleaner.Sweep(paths, retention, logger);
    }
}
