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

public class Administradores implements Iterable<Administrador> {

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

   public Administradores() {
   }

   public void add(Administrador adm) {
      numero++;
      adm.setNumero(numero);
      lista.add(adm);
   }

   public void remove(Administrador adm) {
      lista.remove(adm);
   }

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

   public Administrador buscarAdministrador(int numAdministrador) {
      for (Administrador adm : lista) {
         if (adm.getNumero() == numAdministrador) {
            return adm;
         }
      }
      return null;
   }

   public void mensajeParaAdministrador(String nombreAdministrador, String origen, String mensaje, String original) {
      try {
         origen = "administrador" + origen;
         for (Administrador adm : lista) {
            if (adm.nombreParaMostrar.equalsIgnoreCase(nombreAdministrador)) {

               adm.enviaMensaje(Administrador.MSG_MENSAJE_DE_MESA, origen, original, mensaje);
            }
         }

      } catch (Exception exc) {
      }
   }

   public void mensajeDeMesa(String mesa, String operador, String texto) {
      if (lista.isEmpty()) {
         return;
      }
      for (Administrador adm : lista) {
         adm.mensajeDeMesa(mesa, operador, texto);
      }
   }

   public void enviarTablas() {
      for (Administrador adm : lista) {
         adm.enviarTablas();
      }
   }

   public void comunicarCambioEnAcciones(String registro) {
      enviarMensaje(Administrador.MSG_ENVIO_ACCIONES, registro);
   }

   public void enviarHuecos(String cola, String turno, String huecos) {
      enviarMensaje(Administrador.MSG_HUECOS_POR_COLA, cola, turno, huecos);
   }
    public void enviarRangoHuecos(String listaRangohuecos) {
      enviarMensaje(Administrador.MSG_ENVIO_RANGO_HUECOS, listaRangohuecos);
   }

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

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

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

   public void apagarAdministrador(String numero) {
      int numAdministrador = Integer.parseInt(numero);
      Administrador paraMatar = null;
      for (Administrador adm : lista) {
         if (adm.getNumero() == numAdministrador) {
            paraMatar = adm;
            break;
         }
      }
      if(paraMatar != null) {
         paraMatar.handler.closeConnection();
         lista.remove(paraMatar);
      }
   }

   public void apagarAdministradores(String msg) {
      Administrador[] cli = new Administrador[lista.size()];
      int i = 0;
      for (Administrador adm : lista) {
         cli[i++] = adm;
      }
      for (i = 0; i < cli.length; i++) {
         cli[i].enviaMensaje(Operador.MSG_CIERRE_URGENTE, msg);
      }
   }

   public void refrescar(String mensaje) {
      if (lista.size() > 0) {
         enviarMensaje(Administrador.MSG_ENVIO_RESUMEN_RETRASOS, mensaje);
      }
   }

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

   public String listaNombres(String numeroAdministrador) {
      int numAdm = Integer.parseInt(numeroAdministrador);
      StringBuilder sb = new StringBuilder();
      for (Administrador adm : lista) {
         if (!adm.nombreParaMostrar.equals("") && adm.numero != numAdm) {
            sb.append(adm.nombreParaMostrar).append('·');
         }
      }
      if (sb.length() < 1) {
         return "";
      }
      sb.setLength(sb.length() - 1);
      return sb.toString();
   }
}
