package fr.umlv.guess;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;
import java.nio.charset.Charset;
import java.util.Scanner;

public class GuessUDPClient {
	private final DatagramSocket ds;
	private final DatagramPacket toServerPacket;
	private final DatagramPacket fromServerPacket;
	private final static Charset TRANSFER_CHARSET = Charset.forName("iso-8859-15");
	private static final int INT_SIZE = 4;
	
	public GuessUDPClient(String serverName, int serverPort) throws SocketException, UnknownHostException {
		this.ds = new DatagramSocket();
		this.toServerPacket = 
			new DatagramPacket(new byte[]{}, 0, InetAddress.getByName(serverName), serverPort);
		this.fromServerPacket = 
			new DatagramPacket(new byte[INT_SIZE], INT_SIZE);
	}
	
	public void launch() throws IOException {
		Scanner sc = new Scanner(System.in);
		ds.setSoTimeout(2000);
		while (sc.hasNextLine()) {
			String line = sc.nextLine();
			toServerPacket.setData(line.getBytes(TRANSFER_CHARSET));
			ds.send(toServerPacket);
			fromServerPacket.setLength(INT_SIZE);
			try {
				ds.receive(fromServerPacket);
				if (fromServerPacket.getLength() != INT_SIZE) {
					continue; // simply ignore ill-formed packets
				}
				int dist = byteArrayToInt(fromServerPacket.getData()); 
				System.out.println("distance du mot secret: " + dist);
			} catch (SocketTimeoutException ste) {
				// either the line sent to the server or the distance answer is lost
				ste.printStackTrace();
			}
		}
		ds.close();
	}
	
	public static int byteArrayToInt(byte[] array) throws IllegalArgumentException {
		if (array.length != INT_SIZE)
			throw new IllegalArgumentException("Incompatible size of byte array for a int: " + array.length);
		int lu = 0;
		for(int b = 0; b<INT_SIZE; b++) {
			lu = lu << 8;
			lu |= (array[b] & 0xFF);
		}
		return lu;
	}

	public static void main(String[] args) throws NumberFormatException, IOException {
		if (args.length < 2) {
				System.err.println("Usage: java fr.umlv.guess.KbdToServerUDPClient <serverName> <listeningPort>");
				System.exit(0);
			}
			GuessUDPClient client = new GuessUDPClient(args[0],Integer.parseInt(args[1]));
			client.launch();
	}
}
