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

import java.sql.*;
import java.util.*;

public class CursorPresentes implements MemCursor {

   MemTabla tabla;
   ArrayList<MarcaHora> indice;
   private int idx;
   private int size;
   int adelantoAñadido = 1000 * 1750 ;

   public CursorPresentes(MemTablaCandidatos tabla) {
      this.tabla = tabla;
      indice = new ArrayList<>(100);
   }

   public void actualizar(Timestamp hora, boolean prioridad) {
      try {
         indice.clear();
         int n = tabla.filas.size();
         for (int i = 0; i < n; i++) {
            RegistroCandidatos reg = ((MemTablaCandidatos) tabla).registro(i);
            if (reg.getEstado().equals("P") && reg.getHoraPresente2().compareTo(hora) < 0) {
               int incrCitaPrevia = 0;
               if (prioridad && reg.provieneDeCitaPrevia()) {
                  incrCitaPrevia = adelantoAñadido;
               }
               indice.add(new MarcaHora(reg.getHoraCalculada(), reg.getHoraPresente(), reg, incrCitaPrevia));
            }
         }
         Collections.sort(indice);
         size = indice.size();
         principio();
      } catch (Exception exc) {
         System.err.println("CURSOR_PRESENTES. Error en actualizar:" + exc.getMessage());
      }
   }

   public void actualizar2() {
      indice.clear();
      int n = tabla.filas.size();
      for (int i = 0; i < n; i++) {
         RegistroCandidatos reg = ((MemTablaCandidatos) tabla).registro(i);
         if (reg.getEstado().equals("P")) {
            indice.add(new MarcaHora(reg.getHoraCalculada2(), reg.getHoraPresente(), reg, 0));
         }
      }
      Collections.sort(indice);
      size = indice.size();
      principio();
   }

   public RegistroCandidatos buscarId(int id) {
      for (int i = 0; i < size; i++) {
         RegistroCandidatos reg = indice.get(i).reg;
         if (reg.getId() == id) {
            return reg;
         }
      }
      return null;
   }

   @Override
   public boolean haySiguiente() {
      return idx < size;
   }

   @Override
   public MemRegistro siguiente() {
      if (idx >= size) {
         return null;
      }
      RegistroCandidatos reg = indice.get(idx++).reg;
      return reg;
   }

   @Override
   public void principio() {
      idx = 0;
   }

   public int actual() {
      return -1;
   }

   public void update(MemRegistro reg) {
      try {
         tabla.update(reg);
      } catch (Exception exc) {
      }
   }

   @Override
   public int count() {
      return indice.size();
   }

   class MarcaHora implements Comparable<MarcaHora> {

      long hCalculada;
      long hPresente;
      RegistroCandidatos reg;

      public MarcaHora(Timestamp t1, Timestamp t2, RegistroCandidatos reg, int incremento) {
         hCalculada = t1.getTime() + incremento;
         hPresente = t2.getTime();
         this.reg = reg;
      }

      @Override
      public int compareTo(MarcaHora m) {
         if (hCalculada != m.hCalculada) {
            long l = hCalculada - m.hCalculada;
            return (int) l;
         } else {
            return (int) (hPresente - m.hPresente);
         }
      }
   }
}
