import java.io.*;
import java.util.*;

/**
 * Clase correspondiente a las hebras que manejan la conexiones de cada cliente.
 * @author Luis Fuentes Weber
 */
public class serverThread extends Thread{

    private clientData c;
    private final Vector <clientData> clients;
    private  serverPane pane;

    /**
     * Construye a partir de los datos del cliente, el vector con todos los
     * clientes y el panel, la hebra para el cliente.
     * @param c Objeto clientData correspondiente a los datos del cliente administado por la hebra.
     * @param clients Vector de clientes en el servidor.
     * @param pane Panel de la interfaz grafica.
     */

    public serverThread(clientData c, Vector <clientData> clients, serverPane pane){
        this.c = c;
        this.clients = clients;
        this.pane = pane;
   }


    /**
     * Redefinicion del metodo run. Crea un buffered reader y queda esperando
     * por datos en el socket para luego mandarlos a todos los clientes.
     */
    @Override
   public void run(){
        try {
            //Al iniciar crea el buffered reader y reescribe el panel para incluirlo.
            pane.reWrite();
            String message;
            BufferedReader in = new BufferedReader(new InputStreamReader(c.getSocket().getInputStream()));

            //Espera por mensajes, mientras estos no sean nulos los envia
            while((message = in.readLine())!= null){
                send(message);
            }
            
        } catch (IOException ex) {
           //Error al enviar al cliente, se considera como desconectado.
        }

        //Se remueve el cliente del vector, sincronizado para evitar eliminar un cliente
        //mientras se agregan otros o se envian datos.
        synchronized(clients){
            clients.remove(clients.indexOf(c));
            pane.reWrite();
        }
        

   }

    /**
     * Metodo que envia un string a todos los clientes del vector.
     * Sincronizado con el vector de clientes para que todos los clientes reciban
     * el texto en el mismo orden.
     * @param s String a enviar.
     */
   private void send(String s){
       PrintWriter out;
       synchronized(clients){
           for(int i=0; i<clients.size(); i++){
               out = clients.get(i).getPrinter();
               out.println(s);
           }
       }
   }

}
