using System.Threading.Channels;

namespace TeleWave.Infrastructure.Media;

/// <summary>
/// Базовая сигнальная очередь-будильник поверх Channel: id ассета используется лишь как сигнал,
/// а работу фоновый обработчик всё равно берёт из БД пачкой (по статусу Pending). Поэтому потеря
/// сигнала при рестарте не теряет задачи — они подхватываются из базы.
/// </summary>
public abstract class SignalQueue
{
    private readonly Channel<Guid> _channel = Channel.CreateUnbounded<Guid>(
        new UnboundedChannelOptions { SingleReader = true }
    );

    /// <summary>Разбудить обработчик: появился ассет в статусе Pending.</summary>
    public void Enqueue(Guid assetId) => _channel.Writer.TryWrite(assetId);

    /// <summary>Ждать сигнала о новой работе (с дренажом накопленных).</summary>
    public async ValueTask WaitAsync(CancellationToken cancellationToken)
    {
        await _channel.Reader.ReadAsync(cancellationToken);
        while (_channel.Reader.TryRead(out _))
        {
            // Тело пустое намеренно: сигналы дренируются ради побочного эффекта чтения — работу
            // обработчик всё равно берёт из БД пачкой, и сами значения не нужны.
        }
    }
}
