using System.Buffers;
using System.Threading.Tasks;
namespace System.Net.Sockets.Kcp
{
    /// 
    /// 用于调试的KCP IO 类,没有Kcp功能
    /// 
    public class FakeKcpIO : IKcpIO
    {
        QueuePipe recv = new QueuePipe();
        QueuePipe send = new QueuePipe();
        public int Input(ReadOnlySpan span)
        {
            byte[] buffer = new byte[span.Length];
            span.CopyTo(buffer);
            recv.Write(buffer);
            return 0;
        }
        public int Input(ReadOnlySequence span)
        {
            byte[] buffer = new byte[span.Length];
            span.CopyTo(buffer);
            return Input(buffer);
        }
        public async ValueTask RecvAsync(IBufferWriter writer, object options = null)
        {
            var buffer = await recv.ReadAsync().ConfigureAwait(false);
            var target = writer.GetMemory(buffer.Length);
            buffer.AsSpan().CopyTo(target.Span);
            writer.Advance(buffer.Length);
        }
        public async ValueTask RecvAsync(ArraySegment buffer, object options = null)
        {
            var temp = await recv.ReadAsync().ConfigureAwait(false);
            temp.AsSpan().CopyTo(buffer);
            return temp.Length;
        }
        public int Send(ReadOnlySpan span, object options = null)
        {
            byte[] buffer = new byte[span.Length];
            span.CopyTo(buffer);
            send.Write(buffer);
            return 0;
        }
        public int Send(ReadOnlySequence span, object options = null)
        {
            byte[] buffer = new byte[span.Length];
            span.CopyTo(buffer);
            return Send(buffer);
        }
        public async ValueTask OutputAsync(IBufferWriter writer, object options = null)
        {
            var buffer = await send.ReadAsync().ConfigureAwait(false);
            Write(writer, buffer);
        }
        private static void Write(IBufferWriter writer, byte[] buffer)
        {
            var span = writer.GetSpan(buffer.Length);
            buffer.AsSpan().CopyTo(span);
            writer.Advance(buffer.Length);
        }
    }
}