/* 
* 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 gestor.utiles.*;
import gestor.utiles.DatosException;
import gestor.utiles.Global;
import java.sql.Timestamp;
import java.util.Date;

public class RegistroCandidatos implements Comparable<RegistroCandidatos> {

   public int id;
   public String nif;
   public String nombre;
   public Timestamp horaCita;
   public String estado;
   public Timestamp horaCalculada;
   public Timestamp horaAtendido;
   public Timestamp horaPresente;
   public Timestamp horaCalculada2;
   public String turno;
   public int citaMultiple;
   public String numeroTicket;
   public String cola;
   public String operador;
   public Timestamp horaFinalizado;
   public String codigoEstadistico;
   public String citaVinculada;
   public String codigoGestor;
   public String mesa;
   public String niu;
   public Date horaEstimada;
   TablaCandidatos tabla;

   public RegistroCandidatos(TablaCandidatos tablaCandidatos) {
      super();
      this.tabla = tablaCandidatos;
   }

   @Override
   public int compareTo(RegistroCandidatos r) {
      switch (tabla.orden) {
         case TablaCandidatos.ORDEN_NIF:
            return nif.compareTo(r.nif);
         case TablaCandidatos.ORDEN_NOMBRE:
            return nombre.compareTo(r.nombre);
         case TablaCandidatos.ORDEN_HORACITA:
            return horaCita.compareTo(r.horaCita);
         case TablaCandidatos.ORDEN_TICKET:
            return numeroTicket.compareTo(r.numeroTicket);
         case TablaCandidatos.ORDEN_HORACALCULADA:
            int v = horaCalculada.compareTo(r.horaCalculada);
            if (v == 0) {
               return horaPresente.compareTo(r.horaPresente);
            } else {
               return v;
            }
         case TablaCandidatos.ORDEN_VINCULADA:
            return citaVinculada.compareTo(r.citaVinculada);
         default:
            return 0;
      }
   }

   public void leerRegistroCompleto(String s) throws DatosException {
      String[] cs = Global.split(s, '|');
      if (cs.length < 20) {
         throw new DatosException("Error en registro seriado: pocos campos (" + cs.length + ")");
      }
      try {
         id = Integer.parseInt(cs[0]);
         nif = cs[1];
         nombre = cs[2];
         horaCita = Global.nzt(cs[3]);
         estado = cs[4];
         horaCalculada = Global.nzt(cs[5]);
         horaAtendido = Global.nzt(cs[6]);
         horaPresente = Global.nzt(cs[7]);
         horaCalculada2 = Global.nzt(cs[8]);
         turno = cs[9];
         citaMultiple = Global.nz(cs[10]);
         numeroTicket = cs[11];
         cola = cs[12];
         operador = cs[13];
         horaFinalizado = Global.nzt(cs[14]);
         codigoEstadistico = cs[15];
         citaVinculada = cs[16];
         codigoGestor = cs[17];
         niu = cs[18];
         mesa = cs[19];
         horaEstimada = Global.nzt(cs[20]);
      } catch (Exception exc) {
         throw new DatosException("Error en registro seriado: " + exc.getMessage());
      }
   }

   @Override
   public String toString() {
      StringBuilder buf = new StringBuilder();
      try {
         buf.append(String.valueOf(id)).append('|');
         buf.append(nif).append('|');
         buf.append(nombre).append('|');
         buf.append(horaCita.toString()).append('|');
         buf.append(estado).append('|');
         buf.append(horaCalculada.toString()).append('|');
         buf.append(horaAtendido.toString()).append('|');
         buf.append(horaPresente.toString()).append('|');
         buf.append(horaCalculada2.toString()).append('|');
         buf.append(turno).append('|');
         buf.append(String.valueOf(citaMultiple)).append('|');
         buf.append(numeroTicket).append('|');
         buf.append(cola).append('|');
         buf.append(operador).append('|');
         buf.append(horaFinalizado.toString()).append('|');
         buf.append(codigoEstadistico).append('|');
         buf.append(citaVinculada).append('|');
         buf.append(codigoGestor).append('|');
         buf.append(mesa).append('|');
         buf.append(niu).append('|');
      } catch (Exception exc) {
         exc.printStackTrace();
      }
      return buf.toString();
   }

   public void cambiaEstado(String estado, Timestamp horaPresente, Timestamp horaCalculada) {
      this.estado = estado;
      if (estado.equals(" ")) {
         numeroTicket = " ";
         this.horaPresente = Fecha.horaNula;
         this.horaCalculada = Fecha.horaNula;
         this.horaCalculada2 = Fecha.horaNula;
      } else {
         this.horaPresente = horaPresente;
         this.horaCalculada = horaCalculada;
           if (horaCalculada.after(Fecha.ahora())) {
             horaCalculada2 = horaCalculada;
            } else {
            horaCalculada2 = Fecha.ahora();
            }

      }
      if (estado.equals(" ") || estado.equals("P")) {
         mesa = " ";
      }
      Global.main.comunicaCambioEstado(this);
   }

   public void cambiaEstado(String estado, Timestamp horaPresente, Timestamp horaCalculada, int numero) {
      this.estado = estado;
      if (estado.equals(" ")) {
         this.numeroTicket = "";
         this.citaVinculada = "     ";
         /** OJO AQUI CAMBIADO **/
         this.horaPresente = Fecha.horaNula;
         this.horaCalculada = Fecha.horaNula;
        this.horaCalculada2 = Fecha.horaNula;
         this.citaMultiple = numero;
      } else {
         this.horaPresente = horaPresente;
         this.horaCalculada = horaCalculada;
         this.citaMultiple = numero;
          if (horaCalculada.after(Fecha.ahora())) {
             horaCalculada2 = horaCalculada;
            } else {
            horaCalculada2 = Fecha.ahora();
            }
      }
      if (estado.equals(" ") || estado.equals("P")) {
         this.mesa = " ";
      }
      Global.main.comunicaCambioEstado(this);
   }

   public void forzarEstado(String estado) {
      this.estado = estado;
      mesa = " ";
      if (horaCalculada.after(Fecha.ahora())) {
         horaCalculada2 = horaCalculada;
      } else {
         horaCalculada2 = Fecha.ahora();
      }
      Global.main.comunicaCambioEstado(this);
   }

   public boolean tieneTicket() {
      return numeroTicket.trim().length() > 2;
   }

   public boolean estadoVacio() {
      return estado.compareTo("A") < 0;
   }

   public boolean esCitaPrevia() {
      return  niu.startsWith("·");
   }

   public boolean esRenta() {
      return false;
   }

   public String indicadorNotificaciones() {
      return "-";
   }
}
