/*
* Cette classe, avec ServeurDialogue, est le serveur de chat. Cette classe est le point d'entrée du serveur :
* quand un client cherche à se connecter c'est cette classe qui accepte la connexion, puis qui crée une 
* instance de ServeurDialogue pour chaque client, à qui elle transferre cette connexion.
* Cette classe Serveur possède également une fonction "envoyer", que les instances de ServeurDialogue appelent
* quand elles veulent envoyer un message à tous les clients.
*/

import java.net.*;
import java.util.ArrayList;
import java.net.Socket;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.lang.*;
import java.io.IOException;
import java.io.PrintStream;
import java.util.*;
import java.io.*;

public class Serveur  {
	static int lport,sport;
	static String lhost, rhost;
	private static ArrayList clients;
	private static ServerSocket serveur;



	public static void main(String args[]) {


		String lue,login="";
		BufferedReader clavier;
		clavier=new BufferedReader(new InputStreamReader(System.in));
		clients = new ArrayList();


		//Ce serveur prend un no de port en argument. On commence par vérifier l'argument
		if(args.length != 4) {
			System.out.println("le Serveur prend trois arguments :\n- le nom d'hote ou l'ip de la machine locale\n- le no de port d'ecoute de la machine (qui doit etre compris entre 1024 et 65535)\n- le nom d'hote ou adresse IP du serveur d'enregistrement\n- le no de port d'ecoute du serveur d'enregistrement");
			System.exit(1);
		}

		try {
			while (login.length()==0){
				System.out.print("Entrer un identifiant : ");
				login=clavier.readLine();
			}
			lhost=args[0];
			lport = Integer.parseInt(args[1]);
			rhost=args[2];
			sport = Integer.parseInt(args[3]);
// 			System.out.println("rhost " +rhost+"\nlhost "+lhost+"\nlport " + lport+ "\n sport " +sport);
		} catch(Exception e) {
			System.out.println("erreur : l'argument passe n'est pas un nombre entier");
			System.exit(1);
		}
		if(sport < 1024 || sport > 65535 || lport < 1024 || lport > 65535) {
			System.out.println("erreur : le no de port doit etre compris entre 1024 et 65535");
			System.exit(1);
		}

		socket(serveur);
// 		quelle_serveur();

		
		try{ //écoute des demandes de connexion des clients
			
			new ClientDialogue(lhost,lport,rhost,sport,login);// création d'une instance de ClientDialogue qui traite la connexion ac le serveur
			new ShellDialogue(rhost,sport,login);
			for (;;){
				clients.add(new ServeurDialogue(serveur.accept())); // création d'une instance de ServeurDialogue pour chaque client
// 				System.out.println("Client connecte Servdiag");
			}
		} catch (Exception e) {
			System.out.println("erreur lors de la connexion d'un client : "+e.getMessage());
			System.exit(1);
		}
	} //main

	public static void socket(ServerSocket skt) {
		//création de la socket d'écoute
		try {
			serveur = new ServerSocket(lport);
		} catch (Exception e) {
			System.out.println("erreur a la creation de la socket d'ecoute : "+e.getMessage());
			System.exit(1);
		}
		System.out.println("Serveur demarre sur le port "+lport);
	} //socket


	public static void envoyer(String texte){//cette fonction envoie un message à tous les clients
		for(int i = 0; i < clients.size(); i++)
		{
			((ServeurDialogue)clients.get(i)).envoyer(texte);
		}
	}


	public static void envoyerServeur(ServeurDialogue serveurDialogue, String texte){//cette fonction envoie un message à tous les clients sauf a l emetteur
		for(int i = 0; i < clients.size(); i++)
		{
			if((ServeurDialogue)clients.get(i) != serveurDialogue) {
				((ServeurDialogue)clients.get(i)).envoyer(texte);
			}
		}
	}


	public static void retirerClient(ServeurDialogue serveurDialogue){
		for(int i = 0; i < clients.size(); i++)
		{
			if((ServeurDialogue)clients.get(i) == serveurDialogue)
			{
				clients.remove(i);
				break;
			}
		}
	}


	public static void stopClient(String login) {
		ClientDialogue.stop(login);
		System.exit(0);
	}
		




	public static void connecClient(int port,String host) {
		try {
			Socket skt=new Socket(host,port);
			clients.add(new ServeurDialogue(skt)); // création d'une instance de ServeurDialogue pour chaque client
// 			System.out.println("Client connecte -> connecClient()");
		}
		catch (Exception e){System.out.println("Erreur dans connecCLient()");}
	}


}
