package com.basrikahveci.p2p.peer.network;

import com.basrikahveci.p2p.peer.Config;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.serialization.ClassResolvers;
import io.netty.handler.codec.serialization.ObjectDecoder;
import io.netty.handler.codec.serialization.ObjectEncoder;
import io.netty.handler.timeout.IdleStateHandler;
import io.netty.util.concurrent.EventExecutorGroup;

public class PeerChannelInitializer extends ChannelInitializer<SocketChannel> {

    private final Config config;

    private final ObjectEncoder encoder;

    private final EventExecutorGroup peerChannelHandlerExecutorGroup;

    private final PeerChannelHandler peerChannelHandler;

    public PeerChannelInitializer(Config config, ObjectEncoder encoder, EventExecutorGroup peerChannelHandlerExecutorGroup,
                                  PeerChannelHandler peerChannelHandler) {
        this.config = config;
        this.encoder = encoder;
        this.peerChannelHandlerExecutorGroup = peerChannelHandlerExecutorGroup;
        this.peerChannelHandler = peerChannelHandler;
    }

    @Override
    protected void initChannel(final SocketChannel ch) throws Exception {
        final ChannelPipeline pipeline = ch.pipeline();

        pipeline.addLast(new ObjectDecoder(ClassResolvers.cacheDisabled(null)));
        pipeline.addLast(encoder);
        pipeline.addLast(new IdleStateHandler(config.getMaxReadIdleSeconds(), 0, 0));

        pipeline.addLast(peerChannelHandlerExecutorGroup, peerChannelHandler);
    }

}