/**
 *
 * <p>Titulo: Servidor de respuestas a preguntas</p>
 * <p>Descripcion: Este programa permite generar una pregunta
 * y recepcionar las respuestas a esta.
 * </p>
 * @author Diego Gonzalez Barrientos
 * @version 1.0
 */


//Paquete en el que se encapsula todo el codigo del servidor
package servidorpreguntas;
//Paquetes requeridos para el funcionamiento del programa
import java.io.*;
import javax.bluetooth.*;

/**Clase principal del programa, recibe argumentos a traves de la linea de comandos
 */
public class SPP_Main implements CommandListener
{
  /**
  *Constructor de la clase Main
  */
  public SPP_Main()
  {
    instance = this;
  }
  /** 
  * Funcion que permite mostrar el modo de uso de la aplicacion
  */
  public static void showUsage() {
	  System.out.println("Usage: Pregunta Numero_Alternativas Alternativa_Correcta Numero_Clientes alternativa1 alternativa2 ...");
	  System.exit(1);
	}

  /**
   * Funcion Main para iniciar aplicacion
   * @param args String[]
   */
  public static void main(String[] args )
  {
       //Verifica que el numero de argumentos ingresados sea el correcto
	    if ((args.length < 4)||(((args.length - 4)!= Integer.valueOf(args[1]))&&(args.length != 4))) {
	       showUsage();
	    }
	    else if(args.length == 4) {
		   pregunta = args[0];	
			numero_alternativas = Integer.valueOf(args[1]);	
		   alternativa_correcta = Integer.valueOf(args[2]);	
		   numero_clientes = Integer.valueOf(args[3]);	
       }
		 else if((args.length - 4) == Integer.valueOf(args[1])){
		   pregunta = args[0];	
			numero_alternativas = Integer.valueOf(args[1]);	
		   alternativa_correcta = Integer.valueOf(args[2]);	
		   numero_clientes = Integer.valueOf(args[3]);			 
		    contenidoAlternativas = new String[numero_alternativas];
		    for (int i = 0; i < numero_alternativas; i++)
			   contenidoAlternativas[i] = args[(args.length - numero_alternativas + i)];
		 }
    SPP_Main app = new SPP_Main();
    app.startApp();
    Object obj = new Object();
    synchronized( obj )
    {
      try {
        obj.wait();
      }
      catch (InterruptedException ex) {
      }
    }

  }

  /**
   * Implementa ciclo de vida del MIDlet
   */  
	public void startApp()
  {

	 // servidor todavia no ha comenzado en el constructor
    spp_server = new SPP_Server(pregunta,numero_alternativas,alternativa_correcta,numero_clientes,contenidoAlternativas); 
    spp_screen = new SPP_Screen();
    spp_screen.showui();

  }

  /**
   * Saliendo de la Aplicacion
   */
  public static void quitApp()
  {
    instance = null;
    System.exit(0);
  }



  /**
   * Manejador de acciones de usuario y entradas.
   * Todos los comandos de la GUI son dirigidos aqui por simplicidad.
   * @param c
   * @param d
   */
  public void commandAction( String c, MessageUI d )
  {
    if ( d == spp_screen && c.equals("Correr Servidor") )
    {
      //
      // Iniciando servidor SPP local
      //
      spp_server.run_server();
      spp_screen.showui();

    } else if (d == spp_screen && c.equals("Salir"))
    {
        // Saliendo de la Aplicacion.
        try
        {
          // Intentando cerrar la conexion al servidor antes de salir del programa
          spp_server.doneTrue();
          if ( spp_server.server != null )
            spp_server.server.close();
        }
        catch (IOException ex)
        {
        }
        quitApp();

    }

  }


  /**
   * Fucion que muestra un mensaje de debugeo
   * @param s String
   */
  public static void log(String s)
  {
    System.out.println(s);
  }

  /**
   * Funcion que muestra un mensaje de alerta cuando a ocurrido una excepcion
   * @param e
   * @param next_screen
   */
  public static void alert( Exception e, MessageUI next_screen )
  {
    System.out.println("Exception: "+e.getClass().getName()+" "+e.getMessage());
    next_screen.showui();

  }

  /**
   * Funcion que muestra una caja con un mensaje de alerta
   * @param m String
   * @param next_screen Screen
   */
  public static void alert( String m, MessageUI next_screen )
  {
    System.out.println(m);
    next_screen.showui();

  }
  // variables de la clase SPP_Main
  /** Instancia de la clase SPP_Main
  */
  public static SPP_Main instance;
  /** Referencia a la clase SPP_Screen
  */
  public SPP_Screen spp_screen = null;

  // BLUElet se encarga de descubrir dispositivos y servicios

  // Instancia del servidor bluetooth
  /** Referencia a la clase spp_server
  */
  public SPP_Server spp_server = null;
  // Variables empleadas para recepcionar datos ingresados a través de la linea de comandos
  /** Pregunta que se realiza
  */
  public static String pregunta;
  /**Numero de alternativas para la pregunta
  */
  public static int numero_alternativas;
  /**Alternativa de la pregunta que es la correcta
  */
  public static int alternativa_correcta;
  /**Numero de clientes que se espera respondan la pregunta
  */
  public static int numero_clientes;
  /**Lista alternativas
  */
  public static String[] contenidoAlternativas = null;
  
}
