/* 
* 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.clientes;

import java.util.logging.Level;
import servidor.comunicaciones.GestorColas;
import servidor.datos.TablaAcciones;
import servidor.datos.base.*;
import servidor.utiles.*;

public class Gestor extends Cliente {

   public static final int CONEXION_ACEPTADA = 401;
   public static final int MSG_NUMERO_CANDIDATOS = 402;
   public static final int MSG_REGISTRO_CANDIDATOS = 403;
   public static final int MSG_REGISTRO_COLAS = 404;
   public static final int MSG_NUEVO_CANDIDATO = 405;
   public static final int MSG_MODIFICACION_CANDIDATO = 406;
   public static final int MSG_CAMBIO_ESTADO_MESA = 407;
   public static final int MSG_CAMBIO_NUMERO_MESAS = 408;
   public static final int MSG_REGISTRO_HUECOS = 409;  
   public static final int MSG_CAMBIO_TURNO = 410;
   public static final int MSG_MONITOR_DESCONECTADO = 411;
   public static final int MSG_FORZAR_MANUAL = 412;
   public static final int MSG_MONITORES_CONECTADOS = 413;
   public static final int MSG_ESTIMACION = 414;
   public static final int MSG_CIERRE_DE_COLA = 415;
   public static final int MSG_HUECO_OCUPADO = 416;
   public static final int MSG_OCUPAR_HUECO = 417;
   public static final int MSG_NUEVO_CANDIDATO_NOPRESENTE = 418;
   public static final int MSG_HUECOS_POR_COLA = 419;
   public static final int MSG_MENSAJE_DEL_ADMINISTRADOR = 420;
   public static final int MSG_MENSAJE_DE_MESA = 421;
   public static final int MSG_MENSAJE_RECIBIDO = 422;
   public static final int MSG_LISTAR_HUECOS = 423;
   public static final int MSG_LISTA_SALAS = 424;
   public static final int MSG_LISTA_PUESTOS = 425;
   public static final int MSG_PEDIR_HORA = 426;
   public static final int MSG_RANGO_HUECOS = 427;
   public static final String MESA_DESCONECTADA = "0";
   public static final String MESA_CONECTADA = "1";
   public static final String MESA_LIBRE = "2";
   public static final String MESA_ESPERANDO = "3";
   public static final String MESA_OCUPADA = "4";
   public static final String MESA_DESCANSO = "5";
   public static final String MESA_ERROR_ESTADO = "6";
   public static final int TIPO_GESTOR_NORMAL = 0;
   public static final int TIPO_AUTOSERVICIO = 1;
   public static final int TIPO_MINIGESTOR = 2;
   int numero;
   String codigo;
   private int tipoGestor;

   public Gestor(servidor.comunicaciones.Mensaje msj) throws MensajeException {
      super(msj.getHandler());
      tipo = "gestor";
   }

   public void setNumero(int n) {
      numero = n;
   }

   public int getNumero() {
      return numero;
   }

   public String getCodigo() {
      return codigo;
   }

   public void setCodigo(String v) {
      codigo = v;
   }

   public void setTipo(int tipo) {
      tipoGestor = tipo;
   }

   public int getTipo() {
      return tipoGestor;
   }

   public boolean esGestorNormal() {
      return tipoGestor == 0;
   }

   @Override
   public void cerrarConexion() {
      try {
         gestor.desconectarGestor(this);
      } catch (Exception exc) {
         servidor.ServidorMain.log.log(Level.WARNING, "Error al desconectar Gestor \n{0}", exc.getMessage());
      }
   }

   @Override
   public String toString() {
      return "IP: " + ipAdd + "; Número: " + numero;
   }

   public void enviarAltaOperador(String mesa, String nombre) {
      enviaMensaje(MSG_CAMBIO_ESTADO_MESA, mesa, MESA_CONECTADA, nombre);
   }

   public void enviarCambioEstadoMesa(String mesa, String estado) {
      enviaMensaje(MSG_CAMBIO_ESTADO_MESA, mesa, estado);
   }

   public void enviarCambioEstadoCandidato(String reg) {
      enviaMensaje(MSG_MODIFICACION_CANDIDATO, reg);
   }

   public void enviarCambioEstadoVariosCandidato(String regs) {
      enviaMensaje(MSG_ESTIMACION, regs);
   }

   public void enviarPresenteAMesa(String puesto, String registro) {
      enviaMensaje(MSG_CAMBIO_ESTADO_MESA, puesto, MESA_ESPERANDO, registro);
   }

   public void enviarEstadoMesas() {
      GestorColas gc = GestorColas.getGestor();
      TablaAcciones acciones = gc.tablaAcciones;
      for (MemCursor cur = acciones.getCursor(); cur.haySiguiente();) {
         RegistroAcciones accion = (RegistroAcciones) cur.siguiente();
         if (!accion.getEstado().equals("0")) {
            String nombreOperador = gc.tablaOperadores.buscarNombrePorCodigo(accion.getCodigo());
            enviaMensaje(MSG_CAMBIO_ESTADO_MESA, accion.getPuesto(), accion.getEstado(), nombreOperador);
         }
      }
   }

   public void enviarSalas(String listaSalas) {
      enviaMensaje(MSG_LISTA_SALAS, listaSalas);
   }

   public void enviarPuestos(String listaPuestos) {
      enviaMensaje(MSG_LISTA_PUESTOS, listaPuestos);
   }
  public void enviarRangoHuecos(String listaRangoHuecos)
   {
      enviaMensaje(MSG_RANGO_HUECOS, listaRangoHuecos);
  
   }
   public void enviarTablas() {
      borrarMarcasEnvios();
      GestorColas gc = GestorColas.getGestor();
      enviaMensaje(Administrador.MSG_COMIENZO_ENVIO_COLAS, "");
      gc.enviosMasivos.enviarTablaColas(this);
   }

   public void enviarCambioEstadoCola(String cola, String cerrada, String texto) {
      enviaMensaje(MSG_CIERRE_DE_COLA, cola, cerrada, texto);
   }

   @Override
   public void aviso(int codigo, String txt) {
      if (txt.equals("Transferencia terminada")) {
         transferenciaTerminada(codigo);
      }
   }
   boolean[] marcas = new boolean[2];

   public void borrarMarcasEnvios() {
      marcas[0] = marcas[1] = false;
   }

   synchronized void transferenciaTerminada(int codigo) {
      if (codigo == MSG_REGISTRO_CANDIDATOS) {
         marcas[0] = true;
      }
      if (codigo == MSG_REGISTRO_COLAS) {
         marcas[1] = true;
      }
   }

   public boolean terminadoEnvioCandidatos() {
      return marcas[0];
   }

   public boolean terminadoEnvioColas() {
      return marcas[1];
   }
}
