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

public class Gestores implements Iterable<Gestor> {

   private final List<Gestor> lista = new LinkedList<>();
   int numero = 0;

   public Gestores() {
   }

   public void add(Gestor ge) {
      lista.add(ge);
      numero++;
      ge.setNumero(numero);
   }

   public void remove(Gestor ge) {
      lista.remove(ge);
   }

   public void enviarNuevoCandidato(String remite, String registro) {
      for (Gestor gestor : lista) {
         gestor.enviaMensaje(Gestor.MSG_NUEVO_CANDIDATO, remite, registro);
      }
   }

   public void enviarHuecos(String cola, String turno, String huecos) {
      for (Gestor gestor : lista) {         
         gestor.enviaMensaje(Gestor.MSG_HUECOS_POR_COLA, cola, turno, huecos);
      }
   }
    public void enviarRangoHuecos(String rango ) {
      for (Gestor gestor : lista) {
         gestor.enviaMensaje(Gestor.MSG_RANGO_HUECOS,rango);
      }
   }

   public void listar() {
      if (lista.isEmpty()) {
         System.out.println(" ** No hay Gestores conectados");
         return;
      }
      System.out.println(" ** Gestores conectados : ");
      for (Gestor gestor : lista) {
         System.out.println(gestor.toString());
      }
   }

   public void enviarAltaOperador(String mesa, String nombre) {
      for (Gestor gestor : lista) {         
         if (gestor.esGestorNormal()) {
            gestor.enviarAltaOperador(mesa, nombre);
         }
      }
   }

   public void enviarCambioEstadoMesa(String mesa, String estado) {
      for (Gestor gestor : lista) {
         gestor.enviarCambioEstadoMesa(mesa, estado);
      }
   }

   public void enviarCambioEstadoCandidato(String reg) {
      if (reg == null || reg.equals("")) {
         return;
      }
      for (Gestor gestor : lista) {
         gestor.enviarCambioEstadoCandidato(reg);
      }
   }

   public void enviarEstimacionCandidatos(String regs) {
      if (regs == null || regs.equals("")) {
         return;
      }
      for (Gestor gestor : lista) {
         if (gestor.esGestorNormal()) {
            gestor.enviarCambioEstadoVariosCandidato(regs);
         }
      }
   }

   public void enviarPresenteAMesa(String puesto, String registro) {
      for (Gestor gestor : lista) {
         gestor.enviarPresenteAMesa(puesto, registro);
      }
   }

   public void enviarCambioNumeroMesas(int nuevoNumero) {
      for (Gestor gestor : lista) {
         gestor.enviaMensaje(Gestor.MSG_CAMBIO_NUMERO_MESAS, String.valueOf(nuevoNumero));
      }
   }

   public void comunicaCambioTurno(String nuevoTurno) {
      for (Gestor gestor : lista) {
         gestor.enviaMensaje(Gestor.MSG_CAMBIO_TURNO, nuevoTurno);
      }
   }

   public String buscarCodigoGestor(int numGestor) {
      for (Gestor gestor : lista) {
         if (gestor.getNumero() == numGestor) {
            return gestor.getCodigo();
         }
      }
      return " ";
   }

   public Gestor buscarGestor(int numGestor) {
      for (Gestor gestor : lista) {
         if (gestor.getNumero() == numGestor) {
            return gestor;
         }
      }
      return null;
   }

   public void enviarTablas() {
      for (Gestor gestor : lista) {
         gestor.enviarTablas();
      }
   }

   public void enviarForzarManual() {
      for (Gestor gestor : lista) {
         gestor.enviaMensaje(Gestor.MSG_FORZAR_MANUAL, "");
      }
   }

   public void enviarMonitorDesconectado(String nombreMonitor) {
      for (Gestor gestor : lista) {
         gestor.enviaMensaje(Gestor.MSG_MONITOR_DESCONECTADO, nombreMonitor);
      }
   }

   public void enviarMensajeDeAdministrador(String origen, String mensaje) {
      try {
         for (Gestor gestor : lista) {
            if (gestor.esGestorNormal()) {
               gestor.enviaMensaje(Gestor.MSG_MENSAJE_DEL_ADMINISTRADOR, origen, mensaje);
            }
         }
      } catch (Exception exc) {
         servidor.ServidorMain.log.log(Level.WARNING, "ERROR en enviarMensajeDeAdministrador: {0}", exc.getMessage());
      }
   }

   public void enviarCambioEstadoCola(String cola, String cerrada, String texto) {
      for (Gestor gestor : lista) {
         gestor.enviarCambioEstadoCola(cola, cerrada, texto);
      }
   }

   public void enviarMensajeDeMesa(String mesa, String operador, String texto) {
      for (Gestor gestor : lista) {
         if (gestor.esGestorNormal()) {
            gestor.enviaMensaje(Gestor.MSG_MENSAJE_DE_MESA, mesa, operador, texto);
         }
      }
   }
   
   public void listarHuecos() {
      enviarMensaje(Gestor.MSG_LISTAR_HUECOS,"");
   }
   
   public void apagarGestores(String msg) {
      Gestor[] cli = new Gestor[lista.size()];
      cli = lista.toArray(cli);
       for (Gestor cli1 : cli) {
           cli1.enviaMensaje(Operador.MSG_CIERRE_URGENTE, msg);
       }
   }
   public void pedirHoraGestores() {
      Gestor[] cli = new Gestor[lista.size()];
      cli = lista.toArray(cli);
       for (Gestor cli1 : cli) {
           cli1.enviaMensaje(Gestor.MSG_PEDIR_HORA);
       }
   }

   public void enviarMensaje(int codigo, String txt1, String txt2, String txt3) {
      enviarMensaje(codigo, txt1 + "|" + txt2 + "|" + txt3);
   }

   public void enviarMensaje(int codigo, String txt1, String txt2) {
      enviarMensaje(codigo, txt1 + "|" + txt2);
   }

   public void enviarMensaje(int codigo, String txt) {
      for (Gestor gestor : lista) {
         gestor.enviaMensaje(codigo, txt);
      }
   }

   @Override
   public Iterator<Gestor> iterator() {
      return lista.iterator();
   }
}

