/* 
* 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 servidor.Configuracion;
import servidor.ServidorMain;
import servidor.clientes.*;

public class MensajeAdministrador extends Mensaje {

   public static final int CONEXION = 101;
   public static final int INICIAR_MODO_AUTOMATICO = 105;
   public static final int PEDIR_HISTORICO_TICKET = 106;
   public static final int PEDIR_DATOS_TICKET = 107;
   public static final int CAMBIA_CAPACIDADES = 108;
   public static final int CERRAR_COLA = 109;
   public static final int REPETIR_ENVIO = 110;
   public static final int REPETIR_RECEPCION = 111;
   public static final int ENVIAR_ACCIONES = 112;
   public static final int MODIFICAR_UMBRAL_SUSTITUTOS = 113;
   public static final int NUEVO_OPERADOR = 114;
   public static final int GENERAR_HUECOS = 115;
   public static final int OCUPAR_HUECOS = 116;
   public static final int SOLICITO_HUECOS = 117;
   public static final int MENSAJE_A_OPERADOR = 120;
   public static final int MENSAJE_A_GESTOR = 121;
   public static final int MENSAJE_RECIBIDO = 122;
   public static final int MENSAJE_A_OPERADORES = 123;
   public static final int ENVIAR_LISTA_ADMINISTRADORES = 124;
   public static final int ENVIO_MENSAJE_PARA_ADMINISTRADORES = 125;
   public static final int ENVIO_FICHERO_NOTIFICACIONES = 126;
   public static final int ENVIO_FICHERO_PRESENTES = 127;
   public static final int ENVIO_MODI_RANGO = 128;
   public static final int ENVIO_CERTIFICADO = 130;
   public static final int PEDIR_FICHERO_TICKET = 131;
   public static final int MENSAJE_TEXTO_EXTERNO = 150;
   
   public MensajeAdministrador(String str, org.quickserver.net.server.ClientHandler handler) {
      super(str, handler);
   }

    @Override
   public void procesar() {
      try {
         switch (codigo) {
            case CONEXION:
               if(params.length == 0) {
                  nuevoAdministrador("");
               } else {
                  nuevoAdministrador(params[0]);
               }
               break;
            case PEDIR_DATOS_TICKET:
               GestorColas.getGestor().enviarDatosTicket(params[0], ((DatosCliente) handler.getClientData()).cliente);
               break;
            case PEDIR_HISTORICO_TICKET:
               GestorColas.getGestor().enviarDatosHistoricosTicket(params[0], ((DatosCliente) handler.getClientData()).cliente);
               break;
            case CAMBIA_CAPACIDADES:
               GestorColas.getGestor().cambiaCapacidades(this);
               break;
            case MENSAJE_A_OPERADOR:
               GestorColas.getGestor().mensajeDeAdministradorAOperador(this);
               break;
            case MENSAJE_A_GESTOR:
               GestorColas.getGestor().mensajeDeAdministradorAGestor(this);
               break;
            case MENSAJE_A_OPERADORES:
               GestorColas.getGestor().mensajeDeAdministradorAOperadores(this);
               break;
            case MENSAJE_RECIBIDO:
               GestorColas.getGestor().mensajeRecibido(params[0]);
               break;
            case INICIAR_MODO_AUTOMATICO:
               intentarModoAutomatico();
               break;
            case CERRAR_COLA:
               GestorColas.getGestor().cerrarCola(params[0], params[1], params[2]);
               break;
            case REPETIR_ENVIO:
               GestorColas.getGestor().repetirEnvio(params[0], params[1]);
               break;
            case REPETIR_RECEPCION:
               GestorColas.getGestor().repetirRecepcion();
               break;
            case ENVIAR_ACCIONES:
               ((Administrador) ((DatosCliente) handler.getClientData()).cliente).enviarAccionesHoy();
               break;
             case MODIFICAR_UMBRAL_SUSTITUTOS:
               GestorColas.getGestor().modificarUmbralSustitutos(params[0], params[1]);
               break;   
            case NUEVO_OPERADOR:
               GestorColas.getGestor().altaOperador(params[0], params[1], params[2]);
               break;
            case ENVIO_CERTIFICADO:
               envioCertificado((Administrador)((DatosCliente) handler.getClientData()).cliente);
               break;
            case GENERAR_HUECOS:
               GestorColas.getGestor().generarHuecos(params);
               break;
            case OCUPAR_HUECOS:
               GestorColas.getGestor().ocuparHuecos(params);
               break;
            case SOLICITO_HUECOS:   
               GestorColas.getGestor().enviarHuecosAdministrador(params, ((DatosCliente) handler.getClientData()).cliente);
               break;
            case MENSAJE_TEXTO_EXTERNO:
               servidor.utiles.Global.main.mensajeExterno(params[0]);
               break;
            case ENVIAR_LISTA_ADMINISTRADORES:
               GestorColas.getGestor().enviarListaAdministradores(((DatosCliente) handler.getClientData()).cliente, params[0]);
               break;
            case ENVIO_MENSAJE_PARA_ADMINISTRADORES:
               GestorColas.getGestor().enviarMensajeAAdministradorPorNombre(params[0],params[1], params[2], params[3]);
               break;
            case  ENVIO_FICHERO_NOTIFICACIONES:
               GestorColas.getGestor().enviarFicheroNotificaciones(((DatosCliente) handler.getClientData()).cliente);
               break;
               case  ENVIO_FICHERO_PRESENTES:
               GestorColas.getGestor().enviarFicheroPresentes(((DatosCliente) handler.getClientData()).cliente);
               break;
            case  ENVIO_MODI_RANGO:
               GestorColas.getGestor().enviarModificacionRango(params);
               break;
            case PEDIR_FICHERO_TICKET:
                GestorColas.getGestor().enviarFicheroDatosTicket(params[0],params[1],((DatosCliente) handler.getClientData()).cliente);
                break;
         }

      } catch (Exception exc) {
         ServidorMain.log.warning("Error procesando mensaje de Administrador");
      }
   }
   
   void nuevoAdministrador(String nombre) {
      try {
         Administrador ad = new Administrador(this);
         ad.nombreParaMostrar = nombre;
         if(GestorColas.getGestor().nuevoAdministrador(ad)) {
            GestorColas.getGestor().logAdministradorConectado(this);
            DatosCliente dc = (DatosCliente) handler.getClientData();
            dc.cliente = ad;
            ad.enviaMensaje(Administrador.CONEXION_ACEPTADA, String.valueOf(ad.getNumero()), Configuracion.getConfiguracion().servidorSql, Configuracion.getConfiguracion().BaseDatosAte,Configuracion.getConfiguracion().codigoCentro);
            System.out.println("Nuevo Administrador: " + ad);
         } else {
            System.err.println("Se abortó el alta del Administrador en " + handler.getHostAddress());
            System.err.println(" por problemas en la comunicación");
         }
      } catch (Exception exc) {
         ServidorMain.logException("Error en nuevoAdministrador", exc);
      }
   }
   
   void envioCertificado(Administrador adm) {
      adm.comienzoEnvioCertificado(getIntParam(0));
   }

   void intentarModoAutomatico() {
      GestorColas.getGestor().cambiaModoAutomatico("true");
   }
}
