/* 
* Copyright 2016 Agencia Estatal de Administración Tibutaria
*
* Licencia con arreglo a la EUPL, Versión 1.1 o –en cuanto
* sean aprobadas por la Comisión Europea– versiones
* posteriores de la EUPL (la «Licencia»);
* Solo podrá usarse esta obra si se respeta la Licencia.
* Puede obtenerse una copia de la Licencia en:
*  
* https://joinup.ec.europa.eu/software/page/eupl
*  
* Salvo cuando lo exija la legislación aplicable o se acuerde
* por escrito, el programa distribuido con arreglo a la
* Licencia se distribuye «TAL CUAL», SIN GARANTÍAS NI CONDICIONES
* DE NINGÚN TIPO, ni expresasni implícitas.
*
* Véase la Licencia en el idioma concreto que rige los permisos y 
* limitaciones que establece la Licencia.
*/ 

package servidor.comunicaciones;

import java.util.logging.Level;
import servidor.ServidorMain;
import servidor.clientes.Operador;

public class MensajeOperador extends Mensaje {

   //<editor-fold desc="Constantes">
   public static final int STAY_ALIVE = 0;
   public static final int CONEXION = 1;
   public static final int ESTADO_LIBRE = 2;
   public static final int ESTADO_INICIO = 3;
   public static final int ESTADO_TRABAJO_A_LIBRE = 4;
   public static final int ESTADO_LIBRE_A_INICIO = 5;
   public static final int ESTADO_DESCANSO_A_LIBRE = 7;
   public static final int ESTADO_LIBRE_A_DESCANSO = 13;
   public static final int ESTADO_TRABAJO_A_DESCANSO = 14;
   public static final int ESTADO_TRABAJO_A_TRABAJO = 15;
   public static final int MENSAJE_A_ADMINISTRADOR = 20;
   public static final int MENSAJE_REENVIO_COLA = 21;
   public static final int MENSAJE_ENVIO_REG_PRODUCTOS = 22;
   public static final int MENSAJE_ENVIO_ESTADO_NAVEGACION = 23;
   public static final int MENSAJE_RECIBIDO = 24;
   public static final int MENSAJE_A_GESTOR = 25;
   public static final int MENSAJE_REENVIO_SEGUNDA_COLA = 26;
   public static final int MENSAJE_CONFIRMAR_DESCANSO = 27;
   public static final int MENSAJE_ENVIAR_RESUMEN_COLAS = 28;
   public static final int MENSAJE_ENVIAR_ESTADO_CITA = 29;
   public static final int MENSAJE_SOLICITAR_ESTADO_COLAS = 30;
   public static final int MENSAJE_ENVIAR_FAVORITAS_ESTADISTICAS = 31;
   public static final int MENSAJE_ENVIO_MODIFICACION_REGISTRO = 32;
   public static final int MENSAJE_SOLICITO_AUTOENVIO_COLACERO = 33;
   public static final int MENSAJE_SOLICITO_HUECO = 34;
   public static final int MENSAJE_REPONER_HUECO = 35;
   public static final int MENSAJE_SOLICITO_OPERADORES = 36;
   public static final int MENSAJE_ENVIO_NOTAS = 37;

   //</editor-fold>
   public MensajeOperador(String str, org.quickserver.net.server.ClientHandler handler) {
      super(str, handler);
   }

   @Override
   public boolean esValido() {
      return codigo != STAY_ALIVE;
   }

   @Override
   public void procesar() {
      try {
         GestorColas gestor = GestorColas.getGestor();
         switch (codigo) {
            case STAY_ALIVE:
               return;
            case CONEXION:
               nuevoOperador();
               break;
            case ESTADO_LIBRE_A_INICIO:
               gestor.puestoEsperando(this);
               break;
            case ESTADO_LIBRE:
            case ESTADO_TRABAJO_A_LIBRE:
            case ESTADO_DESCANSO_A_LIBRE:
               gestor.puestoLibre(this);
               break;
            case ESTADO_INICIO:
               gestor.puestoOcupado(this);
               break;
            case ESTADO_LIBRE_A_DESCANSO:
            case ESTADO_TRABAJO_A_DESCANSO:
               gestor.puestoDescansando(this);
               break;
            case ESTADO_TRABAJO_A_TRABAJO:
               gestor.puestoEnVinculacion(this);
               break;
            case MENSAJE_REENVIO_COLA:
               gestor.reenviaPresenteACola(this);
               break;
            case MENSAJE_A_ADMINISTRADOR:
               gestor.mensajeDeMesaAAdministrador(this);
               break;
            case MENSAJE_A_GESTOR:
               gestor.mensajeDeMesaAGestor(this);
               break;
            case MENSAJE_ENVIO_REG_PRODUCTOS:
               gestor.procesarMensajeProductosOperador(this);
               break;
//            case MENSAJE_ENVIO_ESTADO_NAVEGACION:
//               gestor.mensajeCambioNavegacion(this);
//               break;
            case MENSAJE_RECIBIDO:
               gestor.mensajeRecibido(params[2]);
               break;
            case MENSAJE_REENVIO_SEGUNDA_COLA:
               gestor.reenviaPresenteSegundaCola(this);
               break;
            case MENSAJE_CONFIRMAR_DESCANSO:
               gestor.confirmarDescansoOperador(this);
               break;
            case MENSAJE_ENVIAR_RESUMEN_COLAS: 
               gestor.enviarResumenColasAOperador(this);
               break;
            case MENSAJE_SOLICITAR_ESTADO_COLAS:
               gestor.enviarEstadoColasAOperador(this);
               break;
            case MENSAJE_ENVIAR_FAVORITAS_ESTADISTICAS:
               gestor.actualizarCatEstadisticasOperador(this);
               break;
            case MENSAJE_ENVIO_MODIFICACION_REGISTRO:
               gestor.actualizarRegistroCandidato(this);
               break;
            case MENSAJE_SOLICITO_AUTOENVIO_COLACERO:
               gestor.solicitadoTiqueColaCero(this);
               break;
            case MENSAJE_SOLICITO_HUECO :
               gestor.pedirHuecoOperador(this);
               break;
            case MENSAJE_REPONER_HUECO :
               gestor.generarUnHueco(this);
            case MENSAJE_SOLICITO_OPERADORES :
               gestor.pedirlistaOperadores(this);
               break;
            case MENSAJE_ENVIO_NOTAS :
               gestor.grabarNota(this);
               break;
                 
            default:
        
               break;
         }
      } catch (NullPointerException nexc) {
         ServidorMain.log.log(Level.WARNING, "ERROR en mensaje de Operador:\n{0}\n{1}", new Object[]{this.toString(), nexc.getMessage()});
         nexc.printStackTrace();
      } catch (Exception exc) {
         ServidorMain.log.log(Level.WARNING, "ERROR en mensaje de Operador:\n{0}\n{1}", new Object[]{this.toString(), exc.getMessage()});
      }
   }

   void nuevoOperador() throws Exception {
       
      DatosCliente dc = (DatosCliente) handler.getClientData();
      Operador op = new Operador(this);
      op.setEstado(Integer.parseInt(params[2]));
      if (params.length > 3) {
         op.version = params[3];
      }
      if (GestorColas.getGestor().nuevoOperador(op)) {
         dc.cliente = op;
         System.out.println("Nuevo operador: " + op);
      }
   }

   public String getTextoCmd() {
      return textoMensaje.substring(3);
   }

   public String getMesa() {
      return params[0];
   }

   public String getOperador() {
      return params[1];
   }

   public int getId() {
      return Integer.parseInt(params[2]);
   }

   public int getSegundos() {
      return Integer.parseInt(params[3]);
   }

   public int getNumCitas() {
      return Integer.parseInt(params[4]);
   }

   public int getNumRentas() {
      return Integer.parseInt(params[5]);
   }

   public int getNumModificados() {
      return Integer.parseInt(params[6]);
   }

   public int getNumConfirmados() {
      return Integer.parseInt(params[7]);
   }

   public int getImpresas() {
      return Integer.parseInt(params[8]);
   }

   public int getIntranet() {
      return Integer.parseInt(params[9]);
   }
}
