import ReceptorEventos;
import Oyente;

import PanelEntrada;
import PanelControl;
import PanelTertulia;
import DialogoAviso;
import DialogoDatos;
import DialogoVotacion;

import java.awt.*;
import java.applet.*;

public class ClienteAteneo extends Applet implements ReceptorEventos
{
   public static final int TAMX = 450;
   public static final int TAMY = 350;
   public static String servidor;

   PanelEntrada panEntrada;
   PanelControl panControl;
   PanelTertulia panTertulia;
   DialogoAviso dlgAviso;
   DialogoDatos dlgDatos;
   DialogoVotacion dlgVotacion;

   CardLayout disposicion;
   static Frame ventana = null;
   Image fondo = null;
   static String fichero;

   Oyente oyente;
   String nombre,tertulia;

   public static void main( String[] args )
   {
      fichero = (args.length>0) ? args[0] : "Fondo.gif";
      servidor = (args.length>1) ? args[1] : "localhost";

      ventana = new Frame("Ateneo");

      ClienteAteneo applet = new ClienteAteneo();
      applet.init();
      applet.start();

      ventana.setLayout( new BorderLayout() );
      ventana.add("Center",applet);
      ventana.validate();
      ventana.resize(TAMX,TAMY);
      ventana.show();
   }

   public void init( )
   {
      super.init();
      if(ventana==null) {
        servidor = getCodeBase().getHost();
        fichero = getParameter("Imagen");
        fondo = getImage(getDocumentBase(),fichero);
      } else {
        try {
          fondo = Toolkit.getDefaultToolkit().getImage(fichero);
        } catch(Exception e) {}
      }
      creaControles();
      creaDialogos();
      oyente = new Oyente(this);
   }

   public void start( )
   {
      super.start();
   }

   public void creaControles()
   {
      panEntrada = new PanelEntrada(this,fondo);
      panControl = new PanelControl(this);
      panTertulia = new PanelTertulia(this);

      setLayout( disposicion = new CardLayout() );
      add("Entrada",panEntrada);
      add("Control",panControl);
      add("Tertulia",panTertulia);
   }

   public void creaDialogos()
   {
      dlgAviso = new DialogoAviso("Atencion!",this);
      dlgDatos = new DialogoDatos("Introduccion de datos",this);
      dlgVotacion = new DialogoVotacion("Peticion de votacion",this);
   }

   public synchronized void nuevoEvento( Object fuente, int numEvt, String[] args )
   {
      mostrarMensaje(numEvt,args);

      switch( numEvt ) {
         case INT_ALTA:
           if(!oyente.conectado)
             if(!oyente.conectar(servidor)) {
               String[] a = {"No se puede establecer la conexion."};
               dlgAviso.mostrar(bounds(),a);
               break;
             }
           panControl.lisTert.clear();
           oyente.enviarEvento(EXT_ALTA,args);
           break;

         case INT_BAJA: {
           String[] a = {nombre};
           oyente.enviarEvento(EXT_BAJA,a);
           disposicion.show(this,"Entrada");
         } break;

         case INT_PROTER: {
           String[] a = {"Tertulia","Nombre de la nueva tertulia:"};
           dlgDatos.mostrar(bounds(),a);
         } break;

         case INT_CLITER: {
           String[] a = {nombre,args[0]};
           oyente.enviarEvento(EXT_CLITER,a);
         } break;

         case INT_VOTO: {
           String[] a = {tertulia,args[0]};
           oyente.enviarEvento(EXT_VOTO,a);
         } break;

         case INT_LINEA: {
           String[] a = {nombre,tertulia,args[0]};
           oyente.enviarEvento(EXT_LINEA,a);
         } break;

         case INT_FINTER: {
           String[] a = {nombre,tertulia};
           oyente.enviarEvento(EXT_FINTER,a);
         } break;

         case INT_PROVOT: {
           String[] a = {"Votacion","Tema sometido a votacion:"};
           dlgDatos.mostrar(bounds(),a);
         } break;

         case INT_DATO:
           if(args[0].equals("Tertulia")) {
             String[] a = {nombre,args[1]};
             oyente.enviarEvento(EXT_PROTER,a);
           } else
           if(args[0].equals("Votacion")) {
             String[] a = {nombre,tertulia,args[1]};
             oyente.enviarEvento(EXT_PROVOT,a);
           }
           break;

         case EVT_CORTE: {
           String[] a = {"Se ha roto la conexion con el servidor."};
           dlgAviso.mostrar(bounds(),a);
           disposicion.show(this,"Entrada");
         } break;

         case EXT_AVISO: 
           dlgAviso.mostrar(bounds(),args);
           break;

         case EXT_ALTA:
           nombre = new String(args[0]);
           disposicion.show(this,"Control");
           break;

         case EXT_ALTATER:
           panControl.lisTert.addItem(args[0]);
           break;

         case EXT_CLITER: 
           tertulia = new String(args[0]);
           panTertulia.lisDebate.clear();
           disposicion.show(this,"Tertulia");
           break;

         case EXT_VOTO:
           dlgVotacion.mostrar(bounds(),args);
           break;

         case EXT_LINEA:
           panTertulia.lisDebate.addItem(args[0]);
           break;

         case EXT_FINTER:
           disposicion.show(this,"Control");
           break;

         default: {
           String[] a = {"Mensaje no reconocido: "+numEvt};
           dlgAviso.mostrar(bounds(),a);
         }
      }
   }

   public void mostrarMensaje( int numEvt, String[] args )
   {
      switch( numEvt ) {
         case INT_ALTA:    System.out.print("INT_ALTA"); break;
         case INT_BAJA:    System.out.print("INT_BAJA"); break;
         case INT_CLITER:  System.out.print("INT_CLITER"); break;
         case INT_FINTER:  System.out.print("INT_FINTER"); break; 
         case INT_PROTER:  System.out.print("INT_PROTER"); break; 
         case INT_PROVOT:  System.out.print("INT_PROVOT"); break; 
         case INT_LINEA:   System.out.print("INT_LINEA"); break; 
         case INT_DATO:    System.out.print("INT_DATO"); break;
         case INT_VOTO:    System.out.print("INT_VOTO"); break; 
         case EVT_CORTE:   System.out.print("EVT_CORTE"); break; 
         case EXT_AVISO:   System.out.print("EXT_AVISO"); break; 
         case EXT_ALTA:    System.out.print("EXT_ALTA"); break;
         case EXT_BAJA:    System.out.print("EXT_BAJA"); break;
         case EXT_ALTATER: System.out.print("EXT_ALTATER"); break;
         case EXT_CLITER:  System.out.print("EXT_CLITER"); break; 
         case EXT_VOTO:    System.out.print("EXT_VOTO"); break;
         case EXT_LINEA:   System.out.print("EXT_LINEA"); break;
      }
      if(args!=null) {
         System.out.print("{");
         for(int i=0; i<args.length; i++)
           System.out.print(args[i]+" ");
         System.out.print("}");
      }
      System.out.println();
   }
}

