using base_kcp;
using fec.fec;

namespace dotNetty_kcp
{
    public class ChannelConfig
    {
        private bool nodelay;
        private int interval = Kcp.IKCP_INTERVAL;
        private int fastresend;
        private bool nocwnd;
        private int sndwnd = Kcp.IKCP_WND_SND;
        private int rcvwnd = Kcp.IKCP_WND_RCV;
        private int mtu = Kcp.IKCP_MTU_DEF;
        private int minRto = Kcp.IKCP_RTO_MIN;
        //超时时间 超过一段时间没收到消息断开连接
        private long timeoutMillis;
        //TODO 可能有bug还未测试
        private bool stream;

        //下面为新增参数
        private int fecDataShardCount;
        private int fecParityShardCount;
        //收到包立刻回传ack包
        private bool ackNoDelay = false;
        //发送包立即调用flush 延迟低一些  cpu增加  如果interval值很小 建议关闭该参数
        private bool fastFlush = true;
        //crc32校验
        private bool crc32Check = false;

        //增加ack包回复成功率 填 /8/16/32
        private int ackMaskSize = 0;
        /**使用conv确定一个channel 还是使用 socketAddress确定一个channel**/
        private bool useConvChannel=false;
        /**预留长度**/
        private int reserved;


        public void initNodelay(bool nodelay, int interval, int resend, bool nc){
            this.nodelay = nodelay;
            this.interval = interval;
            this.fastresend = resend;
            this.nocwnd=nc;
        }


        public int Conv { get; set; }

        public bool Nodelay
        {
            get => nodelay;
            set => nodelay = value;
        }

        public int Interval
        {
            get => interval;
            set => interval = value;
        }

        public int Fastresend
        {
            get => fastresend;
            set => fastresend = value;
        }

        public bool Nocwnd
        {
            get => nocwnd;
            set => nocwnd = value;
        }

        public int Sndwnd
        {
            get => sndwnd;
            set => sndwnd = value;
        }

        public int Rcvwnd
        {
            get => rcvwnd;
            set => rcvwnd = value;
        }

        public int Mtu
        {
            get => mtu;
            set => mtu = value;
        }

        public int MinRto
        {
            get => minRto;
            set => minRto = value;
        }

        public long TimeoutMillis
        {
            get => timeoutMillis;
            set => timeoutMillis = value;
        }

        public bool Stream
        {
            get => stream;
            set => stream = value;
        }

        public int FecDataShardCount
        {
            get => fecDataShardCount;
            set
            {
                if (value > 0)
                {
                    reserved += Fec.fecHeaderSizePlus2;
                }
                fecDataShardCount = value;
            }
        }

        public int FecParityShardCount
        {
            get => fecParityShardCount;
            set => fecParityShardCount = value;
        }

        public bool AckNoDelay
        {
            get => ackNoDelay;
            set => ackNoDelay = value;
        }

        public bool FastFlush
        {
            get => fastFlush;
            set => fastFlush = value;
        }

        public bool Crc32Check
        {
            get => crc32Check;
            set
            {
                if (value)
                {
                    reserved += Ukcp.HEADER_CRC;
                }
                crc32Check = value;
            }
        }

        public int AckMaskSize
        {
            get => ackMaskSize;
            set => ackMaskSize = value;
        }


        public int Reserved
        {
            get => reserved;
        }

        public bool UseConvChannel
        {
            get => useConvChannel;
            set => useConvChannel = value;
        }
    }
}