package jnet.server.network;

import jnet.lib.LogFile;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.serialization.ClassResolvers;
import io.netty.handler.codec.serialization.ObjectDecoder;
import io.netty.handler.codec.serialization.ObjectEncoder;

/**
 *
 * @author cucky
 */
public class NettyServer extends Thread {

    private int port;

    public NettyServer(int port) {
        this.port = port;
    }

    @Override
    public void run() {
        // Skupiny pro zpracování I/O operací
        EventLoopGroup bossGroup = new NioEventLoopGroup(1);
        EventLoopGroup workerGroup = new NioEventLoopGroup();

        try {
            // Vytvoření ServerBootstrap pro nastavení serveru
            ServerBootstrap serverBootstrap = new ServerBootstrap()
                    .group(bossGroup, workerGroup)
                    .channel(NioServerSocketChannel.class)
                    //.handler(new LoggingHandler(LogLevel.INFO))
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        protected void initChannel(SocketChannel ch) {
                            ch.pipeline().addLast("decoder", new ObjectDecoder(ClassResolvers.weakCachingConcurrentResolver(getClass().getClassLoader())));
                            ch.pipeline().addLast("encoder", new ObjectEncoder());
                            ch.pipeline().addLast(new ServerHandler());  // Vlastní handler pro zpracování zpráv
                        }
                    });

            // Bind serveru na specifikovaný port (např. 8080)
            Channel channel = serverBootstrap.bind(port).sync().channel();

            LogFile.printInfo("Server is ready and listening on port " + port);

            // Čekání na ukončení serveru
            channel.closeFuture().sync();
        } catch (Exception ex) {
            LogFile.printErr("Server exception: " + ex);
        } finally {
            // Uvolnění prostředků
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }
}
