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

import java.io.*;
import java.util.*;
import servidor.clientes.*;
import servidor.comunicaciones.*;
import servidor.datos.base.*;

public class TablaColas extends MemTablaColas {

    HashMap<String, RegistroColas> hash = new java.util.HashMap<>();

    public RegistroColas colaCero = null;

    public TablaColas() {
    }

    public RegistroColas buscarCola(String cola) {
        return hash.get(cola.toUpperCase());
    }

    @Override
    public int cargar(String sql) {
        int n = super.cargar(sql);
        cargarIndice();
        return n;
    }

    @Override
    public int recargar() {
        int n = super.recargar();
        cargarIndice();
        return n;
    }

    public int getTiemposRetraso(String cola) {
        RegistroColas reg = buscarCola(cola);
        if (reg != null) {
            return reg.getTiempoRetrasoMiliseg();
        }
        return 20000;
    }

    public String getSalaEspera(String cola) {
        RegistroColas reg = buscarCola(cola);
        if (reg != null) {
            return reg.getTextoSalaEspera();
        }
        return " ";
    }

    public String getDescripcion(String cola) {
        RegistroColas reg = buscarCola(cola);
        if (reg != null) {
            return reg.getDescripcion();
        }
        return " ";
    }

    void cargarIndice() {
        hash.clear();
        for (int i = 0; i < filas.size(); i++) {
            RegistroColas reg = registro(i);
            hash.put(reg.getCola(), reg);
        }
    }

    public String codigoEstadistico(String cola) {
        RegistroColas reg = buscarCola(cola);
        if (reg != null) {
            return reg.getCodigoEstadistico();
        }
        return null;
    }

    public String listaDeColas() {
        StringBuilder s = new StringBuilder("");
        for (int i = 0; i < filas.size(); i++) {
            RegistroColas reg = registro(i);
            s.append(reg.getCola()).append("=");
            s.append(reg.getDescripcion()).append("=");
            s.append(reg.getBonificacion()).append("|");
        }
        return s.toString();
    }

    public RegistroColas cambiarEstado(String codCola, boolean cerrada) {
        RegistroColas reg = buscarCola(codCola);
        if (reg != null) {
            reg.setCerrada(cerrada);
            try {
                update(reg);
            } catch (Exception exc) {
            }
        }
        return reg;
    }

    public RegistroColas cambiarUmbralSustituciones(String codCola, String nuevoValor) {
        RegistroColas reg = buscarCola(codCola);
        if (reg != null) {
            reg.setUmbralSuplencia(Integer.parseInt(nuevoValor));
            try {
                update(reg);
            } catch (Exception exc) {
            }
        }
        return reg;
    }

    public void cerrarColaAutoenvio() {
        if (colaCero != null) {
            colaCero = buscarColaCeroActiva(colaCero.getCola());
            colaCero.setCerrada(true);
            try {
                update(colaCero);
            } catch (Exception exc) {
            }
        }
    }

    public void reabrirColasCerradas() {
        File fCerradas = new File("mantenerCerradas.txt");
        java.util.HashSet<String> cerradas = new java.util.HashSet<>();
        if (fCerradas.exists()) {
            try {
                BufferedReader bf = new BufferedReader(new FileReader(fCerradas));
                String linea = "";
                while ((linea = bf.readLine()) != null) {
                    cerradas.add(linea.trim().toUpperCase());
                }
            } catch (Exception exc) {
            }
        }
        for (int i = 0; i < filas.size(); i++) {
            RegistroColas reg = registro(i);
            if (cerradas.contains(reg.getCola())) {
                continue;
            }
            reg.setCerrada(false);
            try {
                update(reg);
            } catch (Exception exc) {
            }
        }
    }

    public String listaColasConOperador() {
        StringBuilder sb = new StringBuilder();
        Operadores ops = GestorColas.getGestor().operadores;
        for (int i = 0; i < filas.size(); i++) {
            RegistroColas reg = registro(i);
            if (reg.isActiva() && !reg.isCerrada()) {
                String cola = reg.getCola();
                if (ops.hayOperadorConCapacidad(cola)) {
                    sb.append(cola).append(",");
                }
            }
        }
        if (sb.length() > 0) {
            sb.setLength(sb.length() - 1);
            return sb.toString();
        }
        return "";
    }

    public void listar() {
        System.out.println(" ** Colas definidas: ");
        Set<String> claves = hash.keySet();
        String[] colas = claves.toArray(new String[0]);
        for (int i = 0; i < colas.length; i++) {
            if (colas[i].length() == 1) {
                colas[i] = " " + colas[i];
            }
        }
        Arrays.sort(colas);
        for (String s : colas) {
            RegistroColas rc = hash.get(s.trim());
            System.out.println(rc.toString());
        }
    }

    public RegistroColas buscarColaCeroActiva(String colacero) {
        if (colacero.equals("")) {
            return null;
        }
        if (colaCero != null) {
            return colaCero;
        }
        for (int i = 0; i < filas.size(); i++) {
            RegistroColas reg = registro(i);
            if (reg.getCodigoEstadistico().trim().equals("0") && reg.isActiva() && reg.getCola().equalsIgnoreCase(colacero)) {
                colaCero = reg;
                return reg;
            }
        }
        return null;
    }

    public RegistroColas buscarColaCero() {
        for (int i = 0; i < filas.size(); i++) {
            RegistroColas reg = registro(i);
            if (reg.getCodigoEstadistico().trim().equals("0")) {
                colaCero = reg;
                return reg;
            }
        }
        return null;
    }

    @Override
    public ArrayList<MemRegistro> registros() {
        ArrayList<MemRegistro> lista = new ArrayList<>();
        for (MemRegistro mr : filas) {
            if (((RegistroColas) mr).isActiva()) {
                lista.add(mr);
            }
        }
        return lista;
    }

}
