/* 
* 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.sql.*;
import java.util.*;
import java.util.logging.Level;
import servidor.*;
import servidor.clientes.*;
import servidor.comunicaciones.GestorColas;
import servidor.datos.base.*;

public class ResumenColas {

    HashMap<String, UnaCola> tabla = new HashMap<>();
    HashMap<String, UnaCola> tablaDesac = new HashMap<>();
    TablaColas colas = GestorColas.getGestor().tablaColas;
    CursorPresentes presentes = new CursorPresentes(GestorColas.getGestor().tablaCandidatos);
    Operadores operadores = GestorColas.getGestor().operadores;
    boolean prioridad = GestorColas.getGestor().ordenarConPrioridad;

    public ResumenColas() {
    }

    public void recargarDatos() {
        try {
            tabla.clear();
            MemCursor cursor = colas.getCursor();
            while (cursor.haySiguiente()) {
                RegistroColas reg = (RegistroColas) cursor.siguiente();
                UnaCola cola = new UnaCola();
                cola.codigo = reg.getCola();
                cola.ticket = reg.getNumero();
                if (reg.isActiva()) {
                    tabla.put(cola.codigo, cola);
                } else {
                    tablaDesac.put(cola.codigo, cola);
                }
            }
        } catch (Exception exc) {
            servidor.ServidorMain.log.log(Level.WARNING, "Error al releer tabla de colas:\n{0}", exc.getMessage());
            return;
        }

        presentes.actualizar2();
        while (presentes.haySiguiente()) {
            RegistroCandidatos reg = (RegistroCandidatos) presentes.siguiente();
            UnaCola cola = tabla.get(reg.getCola());
            if (cola == null) {
                cola = tablaDesac.get(reg.getCola());
                tabla.put(cola.codigo, cola);
            }
            String mesaPreferente = reg.getMesa();
            boolean esperaMesa = false;
            if (mesaPreferente != null && !mesaPreferente.trim().equals("")) {
                esperaMesa = true;
            }
            Timestamp t = reg.getHoraCalculada2();
            if (!esperaMesa && cola.retraso.equals("")) {
                if (t != null) {
                    cola.horaCalculada = t;
                    cola.retraso = t.toString();
                }
            }
            if (reg.getHoraCalculada() != null && reg.getHoraCalculada().after(cola.horaCalculada2)) {
                cola.horaCalculada2 = reg.getHoraCalculada();
            }
            if (reg.getHoraEstimada() != null && reg.getHoraEstimada().after(cola.horaEstimada)) {
                cola.horaEstimada = reg.getHoraEstimada();
            }
            cola.presentes++;
        }
    }

    @Override
    public String toString() {
        StringBuilder resultado = new StringBuilder(2048);
        for (UnaCola uc : tabla.values()) {
            resultado.append(uc.toString()).append('|');
        }
        if (resultado.length() > 0) {
            resultado.setLength(resultado.length() - 1);
        }
        return resultado.toString();
    }

    public void dispose() {
        tabla.clear();
        tabla = null;
    }

    public String pendientesPorOperador(Operador op) {
        try {
            recargarDatos();
            StringBuilder sb = new StringBuilder();
            long ahora = (System.currentTimeMillis() / 1000);
            for (Iterator it = op.iteradorCapacidades(); it.hasNext();) {
                Operador.DatosCapacidad capacidad = (Operador.DatosCapacidad) it.next();
                String capa = capacidad.nombre;
                UnaCola cola = tabla.get(capa);
                if (cola != null && cola.presentes > 0 && cola.retraso != null) {
                    try {
                        java.sql.Timestamp ts = java.sql.Timestamp.valueOf(cola.retraso);
                        long lapso = (ahora - (int) (ts.getTime() / 1000)) / 60;
                        sb.append(cola.codigo).append("=").append(cola.presentes).append("=").append(lapso).append("|");
                    } catch (Exception exc) {
                    }
                }
            }
            if (sb.length() > 0) {
                return sb.toString();
            }
        } catch (Exception exc) {
            ServidorMain.logException("Eror en pendientesPorOperador", exc);
        }
        return null;
    }

    public String suplenciasPorOperador(Operador op) {
        try {
            StringBuilder sb = new StringBuilder();
            long ahora = (System.currentTimeMillis() / 1000);
            for (Iterator it = op.iteradorSuplencias(); it.hasNext();) {
                String colaSup = (String) it.next();
                if (colaSup.trim().equals("")) {
                    continue;
                }
                UnaCola cola1 = tabla.get(colaSup);
                RegistroColas cola2 = colas.buscarCola(colaSup);
                if ((cola2 != null && cola2.necesitaSuplentes)
                        && (cola1 != null && cola1.presentes > 0 && cola1.retraso != null)) {
                    try {
                        java.sql.Timestamp ts = java.sql.Timestamp.valueOf(cola1.retraso);
                        long lapso = (ahora - (int) (ts.getTime() / 1000)) / 60;
                        sb.append(cola1.codigo).append("=").append(cola1.presentes).append("=").append(lapso).append("|");
                    } catch (Exception exc) {
                    }
                }
            }
            if (sb.length() > 0) {
                return sb.toString();
            }
        } catch (Exception exc) {
            ServidorMain.logException("Eror en suplenciasPorOperador", exc);
        }
        return null;

    }

    public void calcularSuplencias() {
        MemCursor cursor = colas.getCursor();
        while (cursor.haySiguiente()) {
            RegistroColas reg = (RegistroColas) cursor.siguiente();
            int cont = operadores.contarOperadoresAptos(reg.getCola());
            reg.necesitaSuplentes = (cont < reg.getUmbralSuplencia());
        }
    }

    class UnaCola {

        String codigo = "";
        int presentes = 0;
        String retraso = "";
        int ticket = 0;
        Timestamp horaEstimada = new Timestamp(0);
        Timestamp horaCalculada;
        Timestamp horaCalculada2 = new Timestamp(0);

        @Override
        public String toString() {
            return codigo + "=" + presentes + "=" + retraso + "=" + ticket + "=" + horaEstimada + "=" + horaCalculada2;
        }
    }
}
