package serverP2P;

import java.util.Scanner;
import serverP2P.ServerManagementUDP;
import serverP2P.ServerManagementTCP;
import tools.Directories;
import tools.Logger;
import tools.HostItem;
import tools.TestPort;


/** Server only implementation
 * First argument of main method is port listened by the server, and is mandatory.
 * @author	Louis Royer
 * @author	Flavien Haas
 * @author	JS Auge
 * @version	1.0
 */
public class ServerP2P {
	private int port;
	private Directories directories;
	static private final String subdir = "seeded/";
	private Logger logger;
	private HostItem tracker;

	/** Constructor with portStr containing a port number.
	 * @param portStr	String containing port number of listening.
	 */
	public ServerP2P(String portStr, String trackerHostname, String trackerPortStr) {
		port = Integer.valueOf(Integer.parseInt(portStr));
		tracker = new HostItem(trackerHostname, Integer.valueOf(Integer.parseInt(trackerPortStr)));
		directories = new Directories("P2P_JAVA_PROJECT_SERVER_" + port);
		directories.createSubdir(subdir);
		logger = new Logger(directories.getDataHomeDirectory() + "server.log");
		System.out.println("Server will listen on port " + port + " and serve files from " + directories.getDataHomeDirectory() + subdir);
		Scanner scanner = new Scanner(System.in);
		directories.askOpenDataHomeDirectory(subdir, scanner);
		scanner.close();
	}

	/** Main program entry point
	 * first parameter is port number and is mandatory
	 * to test, run with: java -ea serverP2P.ServerP2P
	 * @param args	parameters
	 */
		public static void main(String [] args) {
			final String defaultHostname = "localhost";
			final String defaultPortServer = "7070";
			final String defaultPortTracker = "6969";
			Scanner scanner = new Scanner(System.in);
			TestPort testPort = new TestPort();

			System.out.println("Server, enter hostname to bind (default = localhost): ");
			String hostnameServer = scanner.nextLine();
			if(hostnameServer.equals("")){
				hostnameServer = defaultHostname;
				System.out.println("using default hostname : " + hostnameServer);
			}	else{
				System.out.println("using hostname : " + hostnameServer);
			}
			System.out.println("enter port (default = 7070): ");
			String portServer = scanner.nextLine();
			if(portServer.equals("")){
				portServer = defaultPortServer;
				System.out.println("using default port : " + portServer);
			}
			else {
				if(!testPort.testPortServer(Integer.parseInt(portServer))){
					System.out.println("Wrong port (7000 -> 7999), using default port 7070");
					portServer = defaultPortServer;
				} else {
					System.out.println("using port : " + portServer);
				}
			}

			System.out.println("enter hostname of tracker (default = localhost): ");
			String hostnameTracker = scanner.nextLine();
			if(hostnameTracker.equals("")){
				hostnameTracker = defaultHostname;
				System.out.println("tracker default hostname : " + hostnameTracker);
			}	else{
				System.out.println("tracker hostname : " + hostnameTracker);
			}
			System.out.println("enter tracker's port (default = 6969): ");
			String portTracker = scanner.nextLine();
			if(portTracker.equals("")){
				portTracker = defaultPortTracker;
				System.out.println("using default port : " + portTracker);
			}
			else {
				if(!testPort.testPortTracker(Integer.parseInt(portTracker))){
					System.out.println("Wrong port (6000 -> 6999), using default port 6969");
					portTracker = defaultPortTracker;
				} else {
					System.out.println("using port : " + portTracker);
				}
			}

			ServerP2P s = new ServerP2P(portServer, hostnameTracker, portTracker);
			ServerManagementUDP smudp = new ServerManagementUDP(s.directories.getDataHomeDirectory() + subdir, hostnameServer, s.port, s.logger, s.tracker);
			ServerManagementTCP smtcp = new ServerManagementTCP(s.directories.getDataHomeDirectory() + subdir, hostnameServer, s.port, s.logger, s.tracker);
			Thread tudp = new Thread(smudp);
			tudp.setName("server UDP P2P-JAVA-PROJECT");
			tudp.start();
			Thread ttcp = new Thread(smtcp);
			ttcp.setName("server TCP P2P-JAVA-PROJECT");
			ttcp.start();
	}
}
