package fr.upem.net.udp.multi;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.NetworkInterface;
import java.net.StandardProtocolFamily;
import java.net.StandardSocketOptions;
import java.nio.ByteBuffer;
import java.nio.channels.DatagramChannel;
import java.nio.channels.MembershipKey;
import java.nio.charset.Charset;
import java.util.Scanner;

public class MulticastChat {

	private static final int BUFFER_SIZE = 512;
	private static final Charset UTF8_CHARSET = Charset.forName("UTF-8");

	private static void usage() {
		System.out.println("MultiCast pseudo groupAddress groupPort interface\n"
				+ "(address must be in range 239.252.0.0 .. 239.255.255.255)");
		System.out.println("\t On university computer: pseudo 239.252.0.100 7777 eth0");
		System.out.println("\t On your laptop: pseudo 239.252.0.100 7777 lo0");
	}

	public static void main(String[] args) throws IOException, InterruptedException {

		if (args.length!=4){
			usage();
			return;
		}

		String pseudo = args[0];
		String groupAddress = args[1];
		Integer groupPort = Integer.parseInt(args[2]);
		String interfaceName = args[3];
		NetworkInterface netif = NetworkInterface.getByName(interfaceName);
		InetSocketAddress group = new InetSocketAddress(groupAddress,groupPort);

		try (DatagramChannel dc = DatagramChannel.open(StandardProtocolFamily.INET)) {
			dc.setOption(StandardSocketOptions.SO_REUSEADDR, true);
			dc.bind(new InetSocketAddress(group.getPort()));
			dc.setOption(StandardSocketOptions.IP_MULTICAST_IF, netif);
			MembershipKey key = dc.join(group.getAddress(), netif);

			final ByteBuffer receiveBuffer = ByteBuffer.allocateDirect(BUFFER_SIZE);
			final ByteBuffer sendBuffer = ByteBuffer.allocateDirect(BUFFER_SIZE);

			Thread reader = new Thread(
					() -> {
						try {
							while (!Thread.interrupted()) {
							    // TODO
							}
						} catch (IOException e) {
							e.printStackTrace();
						} finally {
							key.drop();
						}
					}
					);
			reader.start();

			try (Scanner scan = new Scanner(System.in)) {
				while (scan.hasNextLine()) {
				    // TODO
				}
			}
			reader.interrupt();
			reader.join();
		}
	}
}