import ReceptorEventos;
import Oyente;

import java.util.*;

public class InfoTertulia
{
   String nombre;
   Hashtable lisClientes;
   Vector lineas;
   boolean votando, votandoIncorp;
   int votosSi, votosNo;
   Oyente cliOyente;
   String cliNombre;
   String clienteUltLin;
   String espacios = "                                              ";

   public InfoTertulia( String nombre )
   {
      this.nombre = nombre;
      lisClientes = new Hashtable();
      lineas = new Vector();
      votando = false;
      votandoIncorp = false;
      clienteUltLin = "";
   }

   public void nuevaVotacion( String lin )
   {
      votando = true;
      votandoIncorp = false;
      votosSi = 0;
      votosNo = 0;

      String[] a = {lin};
      Enumeration e = lisClientes.elements();
      while(e.hasMoreElements())
        ((Oyente) (e.nextElement())).enviarEvento(ReceptorEventos.EXT_VOTO,a);
   }

   public void nuevaVotacion( Oyente cliOyente, String cliNombre )
   {
      votando = true;
      votandoIncorp = true;
      this.cliOyente = cliOyente;
      this.cliNombre = cliNombre;
      votosSi = 0;
      votosNo = 0;

      String[] a = {"Espere mientras la tertulia vota su incorporacion..."};
      cliOyente.enviarEvento(ReceptorEventos.EXT_AVISO,a);

      if(lisClientes.size()==0) {
         nuevoVoto("SI");
         return;
      }
      a[0] = "Incorporacion del cliente ["+cliNombre+"] a la tertulia";
      Enumeration e = lisClientes.elements();
      while(e.hasMoreElements())
        ((Oyente) (e.nextElement())).enviarEvento(ReceptorEventos.EXT_VOTO,a);
   }

   public void nuevoVoto( String voto )
   {
      if(voto.equals("SI")) votosSi++; else votosNo++;
      if((votosSi+votosNo)<lisClientes.size()) return;
      // Se termino la votacion
      votando = false;
      String lin = "Propuesta "+
         ((votosSi<votosNo) ? "rechazada" : "aprobada")+
         " por "+votosSi+" votos a favor y "+votosNo+" en contra.";

      String[] a = {lin};
      Enumeration e = lisClientes.elements();
      while(e.hasMoreElements())
        ((Oyente) (e.nextElement())).enviarEvento(ReceptorEventos.EXT_AVISO,a);

      if(votandoIncorp) {
         cliOyente.enviarEvento(ReceptorEventos.EXT_AVISO,a);
         if(votosSi>=votosNo) {
            lisClientes.put(cliNombre,cliOyente);
            a[0] = nombre;
            cliOyente.enviarEvento(ReceptorEventos.EXT_CLITER,a);
            enviarLineas(cliOyente);
         }
      }
   }

   public void nuevaLinea( String cliente, String linea )
   {
      String[] a = {
           (cliente.equals(clienteUltLin)) ?
           espacios.substring(0,cliente.length()+4)+linea :
           "["+cliente+"]: "+linea
         };

      lineas.addElement(a[0]);
      clienteUltLin = cliente;

      Enumeration e = lisClientes.elements();
      while(e.hasMoreElements())
        ((Oyente) (e.nextElement())).enviarEvento(ReceptorEventos.EXT_LINEA,a);

   }

   public void enviarLineas( Oyente cli )
   {
       String[] a = {""};
       for(int i=0; i<lineas.size(); i++) {
         a[0] = (String) (lineas.elementAt(i));
         cli.enviarEvento(ReceptorEventos.EXT_LINEA,a);
       }
   }
}
