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

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;

    public RegistroCandidatos() {
        super();
    }

    @Override
    public int compareTo(RegistroCandidatos r) {
        return horaCita.compareTo(r.horaCita);
    }

    int nz(String s) {
        if (s == null) {
            return 0;
        }
        try {
            return Integer.parseInt(s);
        } catch (Exception exc) {
            return 0;
        }
    }

    Timestamp nzt(String s) {
        if (s == null) {
            return Fecha.TimestampNulo;
        }
        try {
            return Timestamp.valueOf(s);
        } catch (Exception exc) {
            return Fecha.TimestampNulo;
        }
    }

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

    public void cambiaEstado(String estado, Timestamp horaPresente, Timestamp horaCalculada) {
        if (!Global.mainForm.comprobarImpresora()) {
            return;
        }
        this.estado = estado;
        if (estado.equals(" ")) {
            this.numeroTicket = " ";
            this.horaPresente = Fecha.horaNula();
            this.horaCalculada = 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")) {
            this.mesa = " ";
        }
        Global.mainForm.comunicaCambioEstado(this.id);
    }

    @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) {
            //TODO mejorar esta excepcion
            exc.printStackTrace();
        }
        return buf.toString();
    }

    public boolean esCitaPrevia() {
        return niu.trim().length() > 7;
    }

    public boolean esEstadoEnBlanco() {
      return estado.equals(" ") || estado.equals("");
    }

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

}
