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

import java.util.*;
import servidor.clientes.Operador;
import servidor.comunicaciones.*;

public class ColaLibres implements Iterable<Operador> {

   List<Operador> lista;

   public ColaLibres() {
      lista = new LinkedList<>();
   }

   public int size() {
      return lista.size();
   }

   public void encola(Operador o) {
      elimina(o);
      lista.add(o);
   }

   public Operador desencola() {
      if (lista.isEmpty()) {
         return null;
      }
      return lista.remove(0);
   }

   public Operador siguiente() {
      if (lista.isEmpty()) {
         return null;
      }
      return lista.get(0);
   }

   public void elimina(Operador o) {
      while (lista.remove(o)) {
      }
   }

   public void clear() {
      lista.clear();
   }

   public Operador buscaLibre(String colaDemandada) {
      Operador op = buscaConFavorita(colaDemandada);
      if (op == null) {
         op = buscaSinNingunaFavorita(colaDemandada);
      }
      if (op == null) {
         op = buscaConCapacidad(colaDemandada);
      }
      // SUPLENCIAS
      if (op == null) {
         servidor.datos.base.RegistroColas reg = GestorColas.getGestor().tablaColas.buscarCola(colaDemandada);
         if (reg.necesitaSuplentes) {
            op = buscaSuplente(colaDemandada);
         }
      }
      return op;
   }

   public Operador buscaConCapacidad(String colaDemandada) {
      for (Operador op : lista) {
         if (op.tieneCapacidad(colaDemandada)) {
            return op;
         }
      }
      return null;
   }

   public Operador buscaSinNingunaFavorita(String colaDemandada) {
      for (Operador op : lista) {
         if (op.tieneCapacidad(colaDemandada) && !op.tieneAlgunaFavorita()) {
            return op;
         }
      }
      return null;
   }

   public Operador buscaConFavorita(String colaDemandada) {
      for(Operador op : lista) {
         if (op.tieneFavorita(colaDemandada)) {
            return op;
         }
      }
      return null;
   }

   public Operador buscaSuplente(String colaDemandada) {
      for(Operador op : lista) {
         if (op.esSuplente(colaDemandada)) {
            return op;
         }
      }
      return null;
   }

   public Iterator<Operador> iterador() {
      return lista.iterator();
   }

   public Operador buscaPorMesa(String mesa) {
      for(Operador op : lista) {
         if (op.getPuesto().equals(mesa)) {
            return op;
         }
      }
      return null;
   }

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

}
