/*
* 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 la connexion pour gérer les nouvelles connexions et la procédure de login.
* Cette classe Serveur possède également une méthode "envoyer", que les instances de ServeurDialogue appellent
* quand elles veulent envoyer un message à tous les clients sauf à l'émetteur.
*/

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 ServeurM  {

	static int port;
	private static ArrayList clients,car;
	private static ServerSocket serveur;
	public static String caract[];


	public static void main(String args[]) {

		//declaration des variables du main (static)
		String lue;
		BufferedReader clavier;
		clavier=new BufferedReader(new InputStreamReader(System.in));
		clients = new ArrayList();
		car = new ArrayList();

		//Ce serveur prend un no de port en argument. On commence par vérifier l'argument
		if(args.length != 1) {
			System.out.println("le Serveur prend un et un seul argument : le no de port d'ecoute (qui doit etre compris entre 1024 et 65535)");
			System.exit(1);
		}
		try {
			port = Integer.parseInt(args[0]);
		} catch(Exception e) {
			System.out.println("erreur : l'argument passe n'est pas un nombre entier");
			System.exit(1);
		}
		if(port < 1024 || port > 65535) {
			System.out.println("erreur : le no de port doit etre compris entre 1024 et 65535");
			System.exit(1);
		}

		socket(serveur); //creation de la socket d'ecoute
		
		try{ //écoute des demandes de connexion des clients
			
			for (;;){
				ajouterClient();
				
			}
		} 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(port);
		} 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");
	} //socket


	public static void envoyer(ServeurDialogueM serveurDialogueM, String texte){//cette fonction envoie un message à tous les clients sauf au thread emetteur
		for(int i = 0; i < clients.size(); i++)
		{
			if((ServeurDialogueM)clients.get(i) != serveurDialogueM) {
				((ServeurDialogueM)clients.get(i)).envoyer(texte);
			}
		}
	}	


	public static void envoyerServeur(String texte){//cette fonction envoie un message à tous les clients
		for(int i = 0; i < clients.size(); i++)
		{
			((ServeurDialogueM)clients.get(i)).envoyer(texte);
		}
	}


	public static void retirerClient(ServeurDialogueM serveurDialogueM){
		for(int i = 0; i < clients.size(); i++)
		{
			if((ServeurDialogueM)clients.get(i) == serveurDialogueM)
			{
				clients.remove(i);
				break;
			}
		}
	}

	public static void ajouterClient() {
		try {
		clients.add(new ServeurDialogueM(serveur.accept())); 
		// création d'une instance de ServeurDialogue pour chaque client
		}
		catch (Exception e) {
			System.out.println("Problème dans la connexion d'un client");
		}
	}

	public static void ajouterCarClient(String c) {
		car.add(c);
		System.out.println("Client ajoutee :  ["+c+"]");
		int i=0;
		while (i<car.size()) {System.out.println("car["+i+"]="+car.get(i)); i++;}
	}

	public static void retirerCarClient(String c) {
		for(int i = 0; i < car.size(); i++)
		{
			String temp=(String)car.get(i);
			String login=temp.substring(0,temp.indexOf(":"));
			if(login.equals(c))
			{	
				System.out.println("Le client ["+car.get(i)+"] est effacer de la BD");
				car.remove(i);
				break;
			}
		}
	}
}
