/* 
* 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 monitor.datos;
import java.util.*;
import monitor.utiles.*;
public class TablaColas {

   protected ArrayList<RegistroCola> datos;
   protected int posActual;
   private static TablaColas yo = null;
   private boolean _completa = false;

   protected TablaColas() {
      datos = new ArrayList<>();
   }

   public boolean completa() {
      return _completa;
   }

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

   public void vaciar() {
      datos.clear();
   }

   public void setNumElementos(int numero) {
      datos.ensureCapacity(numero);
   }

   public int recordsCount() {
      return datos.size();
   }

   public void beforeFirst() {
      posActual = -1;
   }

   public void first() {
      posActual = 0;
   }

   public void last() {
      posActual = datos.size() - 1;
   }

   public boolean next() {
      if (posActual >= datos.size() - 1) {
         return false;
      } else {
         posActual++;
         return true;
      }
   }

   public boolean previous() {
      if (posActual <= 0) {
         return false;
      } else {
         posActual--;
         return true;
      }
   }

   public void move(int pos) {
      if (pos >= 0 || pos < datos.size()) {
         posActual = pos;
      }
   }

   public RegistroCola actual() {
      return datos.get(posActual);
   }

   public int getId() {
      return datos.get(posActual).id;
   }

   public String getCola() {
      return datos.get(posActual).cola;
   }

   public String getDescripcion() {
      return datos.get(posActual).descripcion;
   }

   public int getBonificacion() {
      return datos.get(posActual).bonificacion;
   }

   public int getNumero() {
      return datos.get(posActual).numero;
   }

   public boolean isActiva() {
      return datos.get(posActual).activa;
   }

   public boolean isCerrada() {
      return datos.get(posActual).cerrada;
   }

   public void setCerrada(boolean v) {
      datos.get(posActual).cerrada = v;
   }

   public String getSalaEspera() {
      return datos.get(posActual).salaEspera;
   }

   public RegistroCola nuevoRegistro(String reg) {
      try {
         RegistroCola r = new RegistroCola();
         r.leerRegistroCompleto(reg);
         if (buscar(r.cola)) {
            datos.set(posActual, r);
         } else {
            datos.add(r);
         }
         return r;
      } catch (Exception exc) {
      }
      return null;
   }

   public void estaCompleta() {
      _completa = true;
   }

   public void modificaRegistro(String reg) {
      try {
         RegistroCola r = new RegistroCola();
         r.leerRegistroCompleto(reg);
         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);
               break;
            }
         }
      } catch (Exception exc) {
      //TODO tratar esta excepcion, quizas devolver codigo de error al servidor?
      }
   }

   public boolean buscar(String cola) {
      int n = datos.size();
      for (int i = 0; i < n; i++) {
         RegistroCola rb = datos.get(i);
         if (rb.cola.equalsIgnoreCase(cola)) {
            posActual = i;
            return true;
         }
      }
      return false;
   }

  
    public boolean esCitaPrevia(String cola) {
      int n = datos.size();
      for (int i = 0; i < n; i++) {
         RegistroCola rb = datos.get(i);
         if (rb.cola.equalsIgnoreCase(cola)) {
            return rb.citaPrevia;
         }
      }
      return false;
   }
   
   public static int nz(String s) {
      if (s == null) {
         return 0;
      }
      try {
         return Integer.parseInt(s);
      } catch (Exception exc) {
         return 0;
      }
   }

   public class RegistroCola {

      public int id;
      public String cola;
      public String descripcion;
      public int bonificacion;
      public int numero;
      public boolean activa;
      public boolean citaPrevia;
      public boolean cerrada;
      public String salaEspera;
      public boolean nifObligatorio;
      
      public void leerRegistroCompleto(String s) throws Exception {
         String[] cs = Global.split(s, '|');
         try {
            id = Integer.parseInt(cs[0]);
            cola = cs[1];
            descripcion = cs[2];
            bonificacion = nz(cs[3]);
            numero = nz(cs[4]);
            activa = (cs[5].equals("1"));
            citaPrevia = cs[7].equals("1");
            cerrada = cs[8].equals("1");
            if (cs[11].equals("null")) {
               salaEspera = " ";
            } else {
               salaEspera = cs[13];
            }
            nifObligatorio = cs[14].equals("1");
            // comprobación de seguridad, por si está mal el ConfiguraServidor...
            if(citaPrevia) nifObligatorio = true;
         } catch (Exception exc) {
           // throw new Exception("Error en registro seriado: " + exc.getMessage());
         }
      }
   }
}

