/* 
* 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 final class ColeccionMesas extends ColeccionRegistros {

    ArrayList<RegistroMesa> indiceMesas;
    int ordenColumna = 2;
    int ordenCampo = 1;
    MapaOperadores operadores;
    int[] idxcol = {14, 2, 1, 8, 7, 4, 6, 5, 12, 18, 19};
    Comparador comparador;
    boolean ascendente = true;

    public ColeccionMesas(MapaOperadores operadores) {
        super();
        indiceMesas = new ArrayList<>();
        this.operadores = operadores;
        ponerOrdenColumna(1);
        comparador = new Comparador();
    }

    @Override
    public void add(IRegistro reg) {
        arbol.put(reg.getId(), reg);
        ordenar(ordenColumna);
    }

    public void ponerOrdenColumna(int col) {
        ordenColumna = col;
        ordenCampo = idxcol[col];
    }

    @Override
    public IRegistro getRegistro(int buscado) {
        int actual = -1;
        for (RegistroMesa reg : indiceMesas) {
            if (!filtrado || !reg.estaDesconectado()) {
                actual++;
            }
            if (actual == buscado) {
                return reg;
            }
        }
        return null;
    }

    public void ordenar(int col) {
        if (col == 4) {
            return;
        }
        indiceMesas.clear();
        numero = 0;
        for (Iterator it = arbol.values().iterator(); it.hasNext();) {
            RegistroMesa reg = (RegistroMesa) it.next();
            indiceMesas.add(reg);
            if (!filtrado || !reg.estaDesconectado()) {
                numero++;
            }
        }
        ponerOrdenColumna(col);
        Collections.sort(indiceMesas, comparador);
    }

    @Override
    public void setFiltro(boolean filtrado) {
        this.filtrado = filtrado;
        ordenar(ordenColumna);
    }

    @Override
    public void clear() {
        arbol.clear();
        indiceMesas.clear();
        numero = 0;
    }

    class Comparador implements Comparator<RegistroMesa> {

        @Override
        public int compare(RegistroMesa o1, RegistroMesa o2) {
            RegistroMesa r1, r2;
            if (ascendente) {
                r1 = o1;
                r2 = o2;
            } else {
                r1 = o2;
                r2 = o1;
            }
            if (ordenCampo == 1 || ordenCampo == 4 || ordenCampo == 5 || ordenCampo == 6 || ordenCampo == 12) {
                Integer ob1, ob2;
                ob1 = Integer.valueOf(r1.columna(ordenCampo));
                ob2 = Integer.valueOf(r2.columna(ordenCampo));
                return ob1.compareTo(ob2);
            } else if (ordenCampo == 2) {   // la columna 2 (codigo) se refiere al nombre del operador
                String s1 = operadores.getNombre(r1.codigo);
                String s2 = operadores.getNombre(r2.codigo);
                return s1.compareTo(s2);
            } else {
                return r1.columna(ordenCampo).compareTo(r2.columna(ordenCampo));
            }
        }
    }
}
