package fr.upem.net.udp;

import java.io.IOException;
import java.net.BindException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.DatagramChannel;
import java.nio.charset.Charset;

public class MyServerIdBetterUpperCaseUDP {

    public static final int BUFFER_SIZE = 1024;
    private final DatagramChannel dc;
    private final ByteBuffer buff = ByteBuffer.allocateDirect(BUFFER_SIZE);

    public MyServerIdBetterUpperCaseUDP(int port) throws IOException {
        dc = DatagramChannel.open();
        dc.bind(new InetSocketAddress(port));
        System.out.println("MyServerIdBetterUpperCaseUDP started on port " + port);
    }

    public void serve() throws IOException {
        while (!Thread.interrupted()) {
          // TODO
          /*
          1) receive request from client
          2) read requestNumber
          3) decode msg in request
          
          String upperCaseMsg = msg.toUpperCase();          
          4) create packet with requestNumber, upperCaseMsg and UTF-8 (or a random charset)
          5) send the packet to client
          */
        }
    }

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

    public static void main(String[] args) throws IOException {
        if (args.length != 1) {
            usage();
            return;
        }
        MyServerIdBetterUpperCaseUDP server;
        int port = Integer.valueOf(args[0]);
        if (!(port >= 1024) & port <= 65535) {
            System.out.println("The port number must be between 1024 and 65535");
            return;
        }
        try {
            server = new MyServerIdBetterUpperCaseUDP(port);
        } catch (BindException e) {
            System.out.println("Server could not bind on " + port + "\nAnother server is probably running on this port.");
            return;
        }
        server.serve();
    }
}
