package fr.umlv.lexico;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.Charset;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MinMaxTCPServer {
	private static final Charset TRANSFER_CHARSET = Charset.forName("ASCII");
	
	private final ServerSocket ss;
	private final ExecutorService executor;
	
	
	public MinMaxTCPServer(int listeningPort) throws IOException {
		this.ss = new ServerSocket(listeningPort);
		this.executor = Executors.newFixedThreadPool(10);
	}
	
	public void launch() throws IOException {
		while (!Thread.currentThread().isInterrupted()) {
			final Socket service = ss.accept();
			executor.submit(new Runnable() {
				String min = null;
				String max = null;
				@Override
				public void run() {
					try {
						BufferedReader in = new BufferedReader(new InputStreamReader(service.getInputStream(), TRANSFER_CHARSET));
						BufferedWriter out = new BufferedWriter(new OutputStreamWriter(service.getOutputStream(),TRANSFER_CHARSET));
						String line;
						while ((line = in.readLine()) != null) {
							if(min == null) {
								min = max = line;
							} else {
								int compMin = line.compareTo(min);
								if(compMin < 0)
									min = line;
								int compMax = line.compareTo(max);
								if(compMax > 0)
									max= line;
							}
							System.out.println("min: " + min + " max: " + max);
							out.write("[ ");
							out.write(min);
							out.write(" .. ");
							out.write(max);
							out.write(" ]");
							out.newLine();
							out.flush();
						}
					} catch (IOException e) {
						// log the problem
						e.printStackTrace();
					} finally {
						try {
							service.close();
						} catch (IOException e) {
							// Do nothing
						}
					}
				}
			});
		}
		executor.shutdown();
		ss.close();
	}
	
	public static void main(String[] args) throws NumberFormatException, IOException {
		if (args.length < 1) {
			System.err.println("Usage: java fr.umlv.lexico.MinMaxTCPServer <listeningPort>");
			System.exit(0);
		}
		MinMaxTCPServer server = new MinMaxTCPServer(Integer.parseInt(args[0]));
		server.launch();
	}


}
