/* 
* 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.sql.*;
import java.util.logging.Level;
import servidor.*;
import servidor.clientes.*;
import servidor.utiles.*;

public class MensajeGestor extends Mensaje {

    public static final int CONEXION = 401;
    public static final int SOLICITO_CAMBIO_AUTOMATICO = 402;
    public static final int ENVIO_MANUAL_SIGUIENTE = 403;
    public static final int ENVIO_MANUAL_A_MESA = 404;
    public static final int SOLICITO_MONITORES = 406;
    public static final int ENVIAR_TABLA_CANDIDATOS = 411;
    public static final int ENVIO_NUEVO_CANDIDATO = 412;
    public static final int ENVIO_MODIFICACION_CANDIDATO = 413;
    public static final int ENVIO_CAMBIO_COLA_O_MESA = 414;
    public static final int SOLICITO_DATOS_TICKET = 415;
    public static final int ENVIO_NUEVO_CANDIDATO_NOPRESENTE = 416;
    public static final int ENVIAR_TABLA_PUESTOS = 417;
    public static final int MENSAJE_A_ADMINISTRADOR = 420;
    public static final int MENSAJE_A_MESA = 421;
    public static final int MENSAJE_RECIBIDO = 422;
    public static final int MENSAJE_A_OPERADORES = 423;
    public static final int MENSAJE_HORA_GESTOR = 426;

    public MensajeGestor(String str, org.quickserver.net.server.ClientHandler handler) {
        super(str, handler);
    }

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

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

    public String getNombre() {
        return params[2];
    }

    public java.sql.Timestamp getHora() {
        return java.sql.Timestamp.valueOf(params[3]);
    }

    public java.sql.Timestamp getHoraHHMM() {
        try {
            if (params[3].equals(Fecha.horaNula)) {
                return Fecha.ahora();
            }
            return java.sql.Timestamp.valueOf(params[3]);
        } catch (Exception exc) {
            return java.sql.Timestamp.valueOf(params[3]);
        }
    }

    public String getCola() {
        return params[4];
    }

    public boolean ignorarHuecos() {
        return argumentos.contains("_ignorarHuecos");
    }

    public boolean usoDNIe() {
        return argumentos.contains("_usoDNIe");
    }

    @Override
    public void procesar() {
        try {
            GestorColas gestorColas = GestorColas.getGestor();
            DatosCliente dc = (DatosCliente) handler.getClientData();
            boolean log = false;
            switch (codigo) {
                case CONEXION:
                    nuevoGestor();
                    break;
                case ENVIAR_TABLA_CANDIDATOS:
                    gestorColas.enviarTablaCandidatos(dc.cliente);
                    break;
                case ENVIO_NUEVO_CANDIDATO:
                    log = true;
                    gestorColas.grabarNuevoCandidato(this);
                    break;
                case ENVIO_MODIFICACION_CANDIDATO:
                    log = true;
                    gestorColas.modificarEstadoCandidato(this);
                    break;
                case ENVIO_CAMBIO_COLA_O_MESA:
                    log = true;
                    gestorColas.modificaColaMesaCandidato(this);
                    break;
                case SOLICITO_MONITORES:
                    gestorColas.enviarMonitores((Gestor) dc.getCliente());
                    break;
                case ENVIAR_TABLA_PUESTOS:
                    gestorColas.enviarPuestos((Gestor) dc.getCliente());
                    break;
                case SOLICITO_CAMBIO_AUTOMATICO:
                    log = true;
                    gestorColas.cambiaModoAutomatico(params[1]);
                    break;
                case ENVIO_MANUAL_SIGUIENTE:
                    log = true;
                    gestorColas.compruebaColaPresentes();
                    break;
                case ENVIO_MANUAL_A_MESA:
                    log = true;
                    gestorColas.enviaPresenteAMesaManual(getIntParam(0), params[1], false);
                    break;
                case MENSAJE_A_ADMINISTRADOR:
                    gestorColas.mensajeDeGestorAAdministrador(this);
                    break;
                case MENSAJE_A_MESA:
                    gestorColas.mensajeDeGestorAOperador(this);
                    break;
                case MENSAJE_A_OPERADORES:
                    gestorColas.mensajeDeGestorAOperadores(this);
                    break;
                case MENSAJE_RECIBIDO:
                    gestorColas.mensajeRecibido(params[0]);
                    break;
                case SOLICITO_DATOS_TICKET:
                    gestorColas.enviarDatosHistoricosTicket(params[0], ((DatosCliente) handler.getClientData()).cliente);
                    break;
                case ENVIO_NUEVO_CANDIDATO_NOPRESENTE:
                    log = true;
                    gestorColas.grabarNuevoCandidatoNoPresente(this);
                    break;

                case MENSAJE_HORA_GESTOR:
                    log = true;
                    gestorColas.horarecibidaGestor(this);
                    break;
            }
            if (log) {
                gestorColas.tablaMsjGestores.insertar(this);
            }

        } catch (Exception exc) {
            String txt = "Error procesando mensaje de Gestor\n   [" + textoMensaje + "]";
            ServidorMain.log.warning(txt);
        }
    }

    void nuevoGestor() {
        try {
            Gestor ge = new Gestor(this);
            GestorColas.getGestor().nuevoGestor(ge, params[0], params[1]);
            DatosCliente dc = (DatosCliente) handler.getClientData();
            dc.cliente = ge;
            System.out.println("Nuevo Gestor: " + ge);
            String numero = String.valueOf(ge.getNumero());
            Configuracion conf = Configuracion.getConfiguracion();
            String numMesas;
            numMesas = "0";
            String margen = String.valueOf(conf.margenRetraso);
            String penalizacion = String.valueOf(conf.tiempoPenalizacion);
            String gestionHuecos = servidor.utiles.Global.btos(conf.gestionHuecosActivada);
            Timestamp horaActual = Fecha.ahora();
            ge.enviaMensaje(Gestor.CONEXION_ACEPTADA, numero, numMesas, margen, penalizacion, servidor.utiles.Global.main.getTurno(), gestionHuecos, Fecha.formatoHoraHMS(horaActual), Fecha.formatoFechaCorta(horaActual), (conf.permitirNoIden ? "1" : "0"));
        } catch (Exception exc) {
            ServidorMain.log.log(Level.WARNING, "ERROR al crear nuevo Gestor:\n{0}\n{1}", new Object[]{this.toString(), exc.getMessage()});
        }
    }
}
