package upem.net.udp.selector;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.DatagramChannel;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.util.Set;

public class ServerEchoNIOTemplate {

    private final DatagramChannel dc;
    private final Selector selector;
    private final int BUFFER_SIZE = 1024;
    private final ByteBuffer buff = ByteBuffer.allocateDirect(BUFFER_SIZE);
    private SocketAddress exp;

    public ServerEchoNIOTemplate(int port) throws IOException {
        selector = Selector.open();
        dc = DatagramChannel.open();
        dc.configureBlocking(false);
        dc.bind(new InetSocketAddress(port));
        dc.register(selector, SelectionKey.OP_READ);
    }


    public void serve() throws IOException {
        Set<SelectionKey> selectedKeys = selector.selectedKeys();
        while (!Thread.interrupted()) {
            selector.select();
            for (SelectionKey key : selectedKeys) {
                if (key.isValid() && key.isWritable()) {
                    doWrite(key);
                }
                if (key.isValid() && key.isReadable()) {
                    doRead(key);
                }
            }
            selectedKeys.clear();
    }
    }

    private void doRead(SelectionKey key) throws IOException {
        // TODO
    }

    private void doWrite(SelectionKey key) throws IOException {
        // TODO
    }

    public static void usage() {
        System.out.println("Usage : ServerEchoNIO port");
    }

    public static void main(String[] args) throws IOException {
        if (args.length != 1) {
            usage();
            return;
        }
        ServerEchoNIOTemplate server= new ServerEchoNIOTemplate(Integer.valueOf(args[0]));
        server.serve();
    }




}

