// Copyright (c) 2023 Timothy Schenk. Subject to the GNU AGPL Version 3 License.

using System.Reflection;

namespace Rai.PacketMediator;

public class PacketDistributorService<TPacketIdEnum, TSession> : Microsoft.Extensions.Hosting.IHostedService
    where TPacketIdEnum : Enum
{
    private readonly PacketDistributor<TPacketIdEnum, TSession> _packetDistributor;

    public PacketDistributorService(IServiceProvider serviceProvider,
        Assembly[] sourcesContainingPackets)
    {
        _packetDistributor = new PacketDistributor<TPacketIdEnum, TSession>(serviceProvider, sourcesContainingPackets);
    }

    public Task StartAsync(CancellationToken cancellationToken)
    {
        return _packetDistributor.DequeueRawPacketAsync(cancellationToken);
    }

    public Task AddPacketAsync(byte[] packetData, TPacketIdEnum operationCode, TSession session)
    {
        return this._packetDistributor.AddPacketAsync(packetData, operationCode, session);
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        return Task.CompletedTask;
    }
}