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

import java.io.*;
import java.util.*;
import gestor.utiles.Global;

public class TablaColas implements Iterable<RegistroCola> {

    protected ArrayList<RegistroCola> datos;
    private static TablaColas yo = null;
    public String colaProfesional;
    private final Hashtable misColas;
    private final String[] salasValidas;

    protected TablaColas() {
        datos = new ArrayList<>();
        misColas = new Hashtable();
        salasValidas = Global.mainForm.conf.SalasValidas.split(",");
    }

    public static TablaColas getTablaColas() {
        if (yo == null) {
            yo = new TablaColas();
        }
        return yo;
    }

    public boolean contieneSala(String sala) {
        if (salasValidas[0].equalsIgnoreCase("Vacio")) {
            return true;
        }
        int n = salasValidas.length;
        for (int i = 0; i < n; i++) {
            if (salasValidas[i].equalsIgnoreCase(sala)) {
                return true;
            }
        }
        return false;
    }

    public boolean contieneCola(String cola) {
        return misColas.containsKey(cola);
    }

    public void borrarNoActualizados() {
        ArrayList<RegistroCola> borrables = new ArrayList<>();
        for (RegistroCola r : datos) {
            if (!r.actualizado) {
                borrables.add(r);
            }
        }
        for (RegistroCola r : borrables) {
            datos.remove(r);
        }
    }

    public void marcarTodosNoActualizados() {
        for (RegistroCola r : datos) {
            r.actualizado = false;
        }
    }

    public RegistroCola nuevoRegistro(String reg) {
        try {
            RegistroCola r = new RegistroCola();
            r.leerRegistroCompleto(reg);
            if (!contieneSala(r.textoSalaEspera)) {
                return null;
            }
            misColas.put(r.cola, r.cola);
            if (!modificaRegistro(r)) {
                datos.add(r);
            }
            r.actualizado = true;
            return r;
        } catch (Exception exc) {
            return null;
        }
    }

    public void ordenar() {
        Collections.sort(datos);
    }

    public void guardarFichero() {
        try {
            PrintWriter pw = new PrintWriter(new FileOutputStream("ListaDeColas.txt", false));
            for (RegistroCola cola : datos) {
                StringBuilder sb = new StringBuilder();
                sb.append(cola.cola).append("\t");
                sb.append(String.format("%1$-40s", cola.descripcion)).append("  ");
                sb.append("activa=").append(cola.activa).append("\t");
                sb.append("citaPrevia=").append(cola.citaPrevia);
                pw.println(sb.toString());
            }
            pw.close();
        } catch (Exception exc) {
        }

    }

    public boolean modificaRegistro(RegistroCola r) {
        try {
            int n = datos.size();
            for (int i = 0; i < n; i++) {
                RegistroCola rb = datos.get(i);
                if (rb.id == r.id) {
                    datos.set(i, r);
                    return true;
                }
            }
        } catch (Exception exc) {
        }
        return false;
    }

    public RegistroCola buscar(String cola) {
        for (RegistroCola rb : datos) {
            if (rb.cola.equalsIgnoreCase(cola)) {
                return rb;
            }
        }
        return null;
    }

    @Override
    public Iterator<RegistroCola> iterator() {
        return datos.iterator();
    }

    public boolean esProfesional(String cola) {
//      int n = datos.size();
//      for (int i = 0; i < n; i++) {
//         RegistroCola rb = datos.get(i);
//         if ((rb.cola.equalsIgnoreCase(cola)) && (rb.codigoServicio == -1)) {
//            colaProfesional = cola;
//            return true;
//         }
//      }
        return false;
    }

    public boolean ExisteColaDeCitaPrevia() {
        int n = datos.size();
        for (int i = 0; i < n; i++) {
            RegistroCola rb = datos.get(i);
            if (rb.citaPrevia && rb.activa) {
                return true;
            }
        }
        return false;
    }

    public boolean ExisteColaDeProfesionales() {
        int n = datos.size();
//      for (int i = 0; i < n; i++) {
//         RegistroCola rb = datos.get(i);
//         if (rb.codigoServicio == -1 && rb.activa) {
//            colaProfesional = rb.cola;
//            //if (gestor.Configuracion.instanciaUnica().infoServicios.get(rb.cola) != null) {
//               return true;
//            //}
//         }
//      }
        return false;
    }

    public boolean TieneCitaPrevia(String cola) {
        RegistroCola reg = buscar(cola);
        return (reg != null && reg.citaPrevia);
    }
}
