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

import java.util.*;

public class ColeccionRegistros {

   TreeMap<String, IRegistro> arbol;
   int numero;
   boolean filtrado = true;

   public ColeccionRegistros() {
      arbol = new TreeMap<>(new Comparador());
   }

   public int size() {
      return numero;
   }

   public int numTotal() {
      return arbol.size();
   }

   public void add(IRegistro reg) {
      arbol.put(reg.getId(), reg);
      numero = numeroFiltrado();
   }

   public IRegistro get(String codigo) {
      return arbol.get(codigo);
   }

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

   public void borrar(IRegistro reg) {
      arbol.remove(reg.getId());
      numero = numeroFiltrado();
   }

   int numeroFiltrado() {
      if (!filtrado) {
         return arbol.size();
      }
      int contador = 0;
      for(IRegistro r : arbol.values()) {
         if (!r.estaDesconectado()) {
            contador++;
         }
      }
      return contador;
   }

   public void setFiltro(boolean filtrado) {
      this.filtrado = filtrado;
      if (filtrado) {
         numero = numeroFiltrado();
      } else {
         numero = arbol.size();
      }
   }

   public boolean getFiltro() {
      return filtrado;
   }

   public IRegistro getRegistro(int buscado) {
      Collection col = arbol.values();
      Iterator it = col.iterator();
      IRegistro encontrado = null;
      int actual = -1;
      while (actual < buscado && it.hasNext()) {
         IRegistro reg = (IRegistro) it.next();
         if (!filtrado || !reg.estaDesconectado()) {
            actual++;
            if (actual == buscado) {
               encontrado = reg;
            }
         }
      }
      return encontrado;
   }

   public Iterator iteradorClaves() {
      return arbol.keySet().iterator();
   }

   public Iterator iteradorValores() {
      return arbol.values().iterator();
   }

   class Comparador implements Comparator<String> {

      @Override
      public int compare(String p1, String p2) {
         int c = p1.length() - p2.length();
         if (c == 0) {
            return p1.compareTo(p2);
         }
         return c;
      }
   }
}
