package org.okou.lippen.network.tool.net;

import org.okou.lippen.network.tool.listener.MessageReceivedListener;
import org.okou.lippen.network.tool.model.DataManager;
import org.okou.lippen.network.tool.net.handler.TCPHandler;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.MessageToByteEncoder;

public abstract class AbstractNetTcp extends AbstractNet {
    protected ChannelHandler initializer;

    protected AbstractNetTcp(DataManager data, MessageReceivedListener listener, String netName) {
        super(data, netName);
        initializer = new ChannelInitializer<SocketChannel>() {
            @Override
            protected void initChannel(SocketChannel ch) throws Exception {
                ch.pipeline().addLast("encoder", new MessageToByteEncoder<byte[]>() {
                    @Override
                    protected void encode(ChannelHandlerContext ctx, byte[] msg, ByteBuf out) throws Exception {
                        out.writeBytes(msg);
                    }
                });
                ch.pipeline().addLast("handler", new TCPHandler(data, listener));
            }
        };
        this.data = data;
    }

    @Override
    public boolean needTarget() {
        return false;
    }

    @Override
    public boolean canRemoveClient() {
        return false;
    }
}