using CliWrap;

namespace InnovEnergy.Lib.Channels.V2.Pipes;

public class ChannelPipeTarget : PipeTarget
{
    private readonly IStreamChannel _StreamChannel;
    private Byte[] _Buffer;

    private ChannelPipeTarget(IStreamChannel streamChannel, UInt32 bufferSize = 64)
    {
        _StreamChannel = streamChannel;
        _Buffer = new Byte[bufferSize];
    }

    public static ChannelPipeTarget FromStreamChannel(IStreamChannel streamChannel, UInt32 bufferSize)
    {
        return new ChannelPipeTarget(streamChannel, bufferSize);
    }
    
    public static PipeTarget FromStreamChannel(IStreamChannel streamChannel)
    {
        return new ChannelPipeTarget(streamChannel);
    }

    public override async Task CopyFromAsync(Stream source, CancellationToken cancellationToken = new CancellationToken())
    {
        var nRead = await source.ReadAsync(_Buffer, 0, _Buffer.Length, cancellationToken);

        await _StreamChannel.Write(new ArraySegment<Byte>(_Buffer, 0, nRead));

        if (nRead >= _Buffer.Length)
            _Buffer = new Byte[_Buffer.Length * 2];
    }
}