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

import cargador.*;
import java.awt.*;
import java.awt.print.*;
import java.io.*;
import java.io.IOException;
import java.util.*;
import java.util.jar.*;
import java.util.logging.*;
import javax.print.*;
import javax.swing.*;
import gestor.utiles.*;
import gestor.datos.*;

public final class Main extends javax.swing.JFrame implements cargador.ILanzable {
   //<editor-fold desc=" 1.Variables ">
    //java.util.Timer iniciador;

    public int numeroGestor;
    String turno;
    public Comunicaciones comunicaciones;
    TablaColas colas;
    TablaCandidatos candidatos;
    TablaHuecos huecos;
    LinkedList mensajesPendientes = new LinkedList();
    public Cursor cursorTransparente;
    public static final Logger log = Logger.getLogger("Logger");
    ;
   java.util.Date fechaHoy;
    public ImpresorTicket impresorTicket;
    public Configuracion conf;
    Parametros args;
    java.applet.AudioClip clip;
    boolean cerrado = false;
    boolean enAsesores = false;
    SalvaPantalla salvaPantalla;
    private javax.swing.Timer timerSalvaPantalla = null;
    Process procesoBloqueaTeclado = null;
    public boolean gestionHuecos;
    LogGenerico logImpresora = null;
    public int memoria = 0;

    public LectorSmartCard lectorSC;

    //</editor-fold>
    public Main() {
        Global.mainForm = this;
        Global.trad = new TraductorPrincipal();
        Global.gestorIdiomas = new GestorIdiomas();
        preparaLogging();
        initComponents();
        cargarLogo();
        if (!cargarConfiguracion()) {
            JOptionPane.showMessageDialog(null, "Error al cargar el fichero de configuración");
            System.exit(-1);
        }
        // apagar el servicio de mensajeria de Windows
        creaCursorOculto();
        Global.gestorIdiomas.cargarTraducciones();
        conf.textoSalaEspera = Global.trad.valor("Sala de espera");
        conf.textoAgenciaTributaria = Global.trad.valor("titulo");
        conf.textoCortoAgenciaTributaria = Global.trad.valor("tituloCorto");
        if (conf.tiempoSalvaPantalla > 0) {
            timerSalvaPantalla = new javax.swing.Timer(conf.tiempoSalvaPantalla, (java.awt.event.ActionEvent e) -> {
                mostrarSalvaPantalla();
            });
        }
        lectorSC = new LectorSmartCard();
    }

    void cargarLogo() {
        File logo = new File("imagenes/SplashAteneo.jpg");
        ImageIcon icono;
        if (logo.exists()) {
            icono = new javax.swing.ImageIcon(logo.getAbsolutePath());
        } else {
            icono = new javax.swing.ImageIcon(getClass().getResource("/recursos/Splash_renta.jpg"));
        }
        jLabel1.setSize(icono.getIconWidth(), icono.getIconHeight());
        this.setSize(icono.getIconWidth(), icono.getIconHeight());
        jLabel1.setIcon(icono);
        this.repaint();
    }

    boolean cargarConfiguracion() {
        try {
            conf = Configuracion.instanciaUnica();
            conf.cargar();
            return true;
        } catch (Exception exc) {
            return false;
        }
    }

    void preparaLogging() {
        try {
            Handler fh = new FileHandler("Gestor.log");
            fh.setFormatter(new SimpleFormatter());
            log.addHandler(fh);
            log.setLevel(Level.FINEST);
        } catch (Exception exc) {
            MsgBox("No se ha podido iniciar el proceso de LOG");
            System.exit(-1);
        }
        Global.borrarLogsAntiguos("logs", "logImpresora", 10);
    }

    public static void logException(String s, Exception ex) {
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        ex.printStackTrace(pw);
        log.log(Level.CONFIG, "{0}\r\n{1}", new Object[]{s, sw.toString()});
    }

    void ejecutarBloqueoTeclado() {
        try {
            if (conf.bloquearTeclado) {
                procesoBloqueaTeclado = Runtime.getRuntime().exec("bloqueateclado.exe");
            }
        } catch (IOException ex) {
        }
    }

    public void apagarMaquina() {
        File file = generarFicheroApagado();
        try {
            Runtime.getRuntime().exec(file.getAbsolutePath());
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    File generarFicheroApagado() {
        String path = System.getProperty("user.dir");
        File file;
        File dir = new File("c:\\AEAT");
        if (dir.exists()) {
            file = new File(dir, "apagar.cmd");
        } else {
            file = new File(path, "apagar.cmd");
        }
        file.delete();
        try {
            PrintStream salida = new PrintStream(new FileOutputStream(file, false));
            String linea = "";
            if (Global.versionSO() > 5) {
                linea = "shutdown.exe /s";
            } else {
                linea = "\"" + path + "\\psshutdown.exe\" -k -c -t 30 -m \"PULSE EL BOTON Cancel PARA ABORTAR EL APAGADO DEL EQUIPO\"";
            }
            salida.println(linea);
            salida.close();
        } catch (Exception exc) {
            exc.printStackTrace();
        }
        return file;
    }

    void eliminaBloqueoTeclado() {
        if (procesoBloqueaTeclado != null) {
            procesoBloqueaTeclado.destroy();
        }
    }

    void inicia() {
        ejecutarBloqueoTeclado();
        colas = TablaColas.getTablaColas();
        candidatos = TablaCandidatos.getTablaCandidatos();
        huecos = TablaHuecos.getTablaHuecos();
        preparaComunicaciones();
    }

    void preparaComunicaciones() {
        comunicaciones = new Comunicaciones();
        if (!comunicaciones.abrir()) {
            System.exit(0);
        }
    }

    void preparaImpresora() {
        String nombre = conf.impresora.trim().toLowerCase();
        if (!nombre.equals("")) {
            PrintService[] pservices = PrintServiceLookup.lookupPrintServices(null, null);
            boolean encontrado = false;
            for (PrintService pservice : pservices) {
                if (pservice.getName().toLowerCase().equals(nombre)) {
                    encontrado = true;
                    break;
                }
            }
            if (!encontrado) {
                nombre = "";
            }
        }
        while (nombre.equals("")) {
            try {
                PrinterJob pj = PrinterJob.getPrinterJob();
                pj.printDialog();
                nombre = pj.getPrintService().getName();
                conf.impresora = nombre;
                pj.cancel();
                conf.guardar();
            } catch (Exception exc) {
            }
        }
        impresorTicket = new ImpresorTicket(conf.impresora);
        impresorTicket.setNombrePlataforma(conf.centro);
        if (conf.codigosCorteTicket != null) {
            impresorTicket.setImprimirCorte(true);
        }
    }

    void activaMonitorImpresoraCUSTOM() {
        // por ahora solo se monitorizan impresoras CUSTOM (quiosco)
        if (conf.esImpresoraCUSTOM) {
            try {
                extraerRecursoDelJar("PrinterStatus.dll");
                extraerRecursoDelJar("cesmlm.dll");
                System.loadLibrary("PrinterStatus");
                Global.comprobarImpresora = true;
            } catch (Exception exc) {
                Global.comprobarImpresora = false;
            }
        }
    }

    public void conexionAceptada(String msj) {
        try {
            String[] params = Global.split(msj, '|');
            numeroGestor = Integer.parseInt(params[0]);
            conf.margenRetraso = Integer.parseInt(params[2]) * 60000;
            conf.margenPenalizacion = Integer.parseInt(params[3]) * 60000;
            turno = params[4];
            gestionHuecos = Global.stob(params[5]);
            try {
                String horaActual = params[6];
                String co = "cmd /C time " + horaActual;
                Runtime.getRuntime().exec(co);
            } catch (Exception exc) {

            }
            try {
                String fechaActual = params[7];
                String co = "cmd /C date " + fechaActual;
                Runtime.getRuntime().exec(co);
            } catch (Exception exc) {
            }
            try {
                if (params[8].equalsIgnoreCase("0")) {
                    conf.permitirNoIden = false;
                }
            } catch (Exception exc) {
            }

        } catch (NumberFormatException exc) {
            log.log(Level.SEVERE, "Error en los parametros del mensaje CONEXION ACEPTADA: {0}", msj);
        } catch (Exception exc) {
            log.log(Level.SEVERE, "Error al arrancar la ventana principal: {0}", exc.getMessage());
        }
    }

    public void iniciarCargaCandidatos() {
        candidatos.vaciar();
    }

    public void nuevoRegistroCandidatos(String reg) {
        candidatos.nuevoRegistro(reg);
    }

    public void nuevoRegistroHuecos(String reg) {
        if (!reg.equals("FIN_REGISTROS")) {
            if (huecos.cargada) {
                huecos.vaciar();
            }
            huecos.nuevoRegistro(reg);
        } else {
            huecos.finCarga();
        }
    }

    public void incorporarHuecos(String msj) {
        String[] cs = Global.split(msj, '|');
        huecos.incorporarCitas(cs[0], cs[1], cs[2]);
    }

    public void nuevoCandidato(String reg) {
        String reg2;
        String[] partes = reg.split("\\|", 2);
        Registro r = new Registro(partes[1]);
        reg2 = partes[1];
        if (partes[0].equals(String.valueOf(numeroGestor))) {
            imprimirTicket(r);
        }
        candidatos.nuevoRegistro(reg2);
    }

    public void nuevoCandidatoNoPresente(String reg) {
        boolean respuesta;
        Registro r = new Registro(reg);
        DlgConfirmarNoPresente noPresente = new DlgConfirmarNoPresente(Global.panel);
        noPresente.completarRotulos(r);

        noPresente.setVisible(true);
        respuesta = noPresente.emitirTicket;
        noPresente.dispose();
        noPresente = null;
        Global.mainForm.resetMemoria();
        if (respuesta) {
            RegistroCandidatos reg2 = candidatos.getRegistro(r.id);
            reg2.estado = "P";
            reg2.horaCalculada = reg2.horaCita;
            Global.mainForm.comunicaCambioEstado(reg2.id);
        }
    }

    public void cambiaEstadoCandidato(String msj) {
        candidatos.modificaRegistro(msj);
    }

    public void iniciarEnvioDeColas() {
        colas.marcarTodosNoActualizados();
    }

    public void nuevoRegistroColas(String reg) {
        if (!reg.equals("FIN_REGISTROS")) {
            colas.nuevoRegistro(reg);
        } else {
            colas.borrarNoActualizados();
            // nos han mandado el registro centinela, así que podemos continuar
            colas.ordenar();
            colas.guardarFichero();
            conf.infoServicios.completar();
            comienzoOperaciones();
        }
    }

    public void cambiarEstadoCola(String msj) {
        String[] params = Global.split(msj, '|');
        if (params.length < 3) {
            return;
        }
        RegistroCola regCola = colas.buscar(params[0]);
        if (regCola != null) {
            regCola.cerrada = (params[1].equals("si"));
            regCola.textoCerrada = params[2];
        }
    }

    void comienzoOperaciones() {
        comunicaciones.enviar(Comunicaciones.ENVIAR_TABLA_CANDIDATOS, "xx");
        preparaImpresora();
        if (conf.comprobarImpresora) {
            activaMonitorImpresoraCUSTOM();
        }
        if (Global.panel == null) {
            arrancaVentanaPrincipal();
            setVisible(false);
        }
    }

    void extraerRecursoDelJar(String nombre) {
        JarFile jar = null;
        try {
            jar = new JarFile("AutoServicio.jar");
            JarEntry entrada = jar.getJarEntry(nombre);
            if (entrada == null) {
                jar.close();
                return;
            }
            File salida = new File(nombre);
            long fechaInterna = entrada.getTime();
            if (salida.exists()) {
                long fechaExterna = salida.lastModified();
                if (fechaInterna == fechaExterna) {
                    jar.close();
                    return;
                }
            }
            InputStream is = new BufferedInputStream(jar.getInputStream(entrada));
            OutputStream os = new BufferedOutputStream(new FileOutputStream(salida));
            byte[] bufer = new byte[2048];
            for (;;) {
                int nBytes = is.read(bufer);
                if (nBytes <= 0) {
                    break;
                }
                os.write(bufer, 0, nBytes);
            }
            os.flush();
            os.close();
            salida.setLastModified(fechaInterna);
            jar.close();
        } catch (Exception exc) {
            exc.printStackTrace();
        }
    }

    public boolean comprobarImpresora() {
        if (!Global.comprobarImpresora) {
            return true;
        }
        if (!PrinterStatus.comprobarImpresoraPreparada()) {
            DlgMensajeGenerico dlg = new DlgMensajeGenerico(Global.panel);
            dlg.setLinea1(Global.trad.valor("ErrImpresora1"));
            dlg.setLinea2(Global.trad.valor("ErrImpresora2"));
            dlg.setLinea3(Global.trad.valor("ErrImpresora3"));
            dlg.setVisible(true);
            return false;
        }
        return true;
    }

    public void comunicaCambioEstado(int id) {
        RegistroCandidatos reg = candidatos.getRegistro(id);
        comunicaciones.enviar(Comunicaciones.ENVIO_MODIFICACION_CANDIDATO, Integer.toString(numeroGestor), reg.toString(),
                Global.panel.haUsadoDNIe ? "_usoDNIe" : "sinDNIe");
    }

    public String getTurno() {
        return turno;
    }

    public void setTurno(String nuevoTurno) {
        turno = nuevoTurno;
        candidatos.cambiaTurno();
    }

    public void imprimirTicket(Registro reg) {
        try {
            impresorTicket.setHoraCalculada(reg.horaCalculada2);
            impresorTicket.setHoraEmision(reg.horaPresente);
            impresorTicket.setNumeroTicket(reg.numeroTicket);
            impresorTicket.setIdTicket("" + reg.id);
            impresorTicket.setNif(reg.nif);

            RegistroCola regCola = colas.buscar(reg.cola);
            if (regCola != null) {
                InfoServicio is = Global.panel.infoServicios.get(reg.cola);
                if (is != null) {
                    impresorTicket.setNombreCola(Global.limpiaHtml(is.getDescripcion()));
                } else {
                    impresorTicket.setNombreCola(regCola.descripcion);
                }
                impresorTicket.setTextoTicket(regCola.textoSalaEspera);
            } else {
                impresorTicket.setNombreCola("");
            }
            impresorTicket.print();
            DlgTicketVisual ftv = new DlgTicketVisual(Global.panel);
            ftv.setTextoEtiqueta(reg.numeroTicket);
            if (regCola != null) {
                ftv.setTextoSala(regCola.textoSalaEspera);
            } else {
                ftv.setTextoSala("");
            }
            ftv.setVisible(true);
            ftv.dispose();
            Global.mainForm.resetMemoria();
        } catch (Exception exc) {
            logException("Error en imprimir ticket", exc);
            exc.printStackTrace();
        }
        //guardarLogTicket(reg);
    }

    public void guardarLogTicket(Registro r) {

        if (logImpresora == null) {
            java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("ddMMyyyy");
            String cadenaFecha = sdf.format(new Date());
            String nombre = "logImpresora_" + cadenaFecha + ".log";
            File logimpre = new File(nombre);
            if (!logimpre.exists()) {
                logImpresora = new LogGenerico(nombre, "Impresora");
            }
        }
        logImpresora.escribir(r.nif + ";" + r.id + ";" + r.numeroTicket + ";" + r.cola + ";" + Fecha.formatoHoraHMS(new Date()));
    }

    public void mandarPeticion(String letraCola, String nif, String nombre, java.sql.Timestamp hora) {
        if (!comprobarImpresora()) {
            return;
        }
        String sHora = hora.toString();
        comunicaciones.enviar(Comunicaciones.ENVIO_NUEVO_CANDIDATO, String.valueOf(numeroGestor),
                nif, nombre, sHora, letraCola, Global.panel.haUsadoDNIe ? "_usoDNIe" : "_");
    }

    public void mandarPeticionNoPresente(String letraCola, String nif, String nombre, java.sql.Timestamp hora) {
        comunicaciones.enviar(Comunicaciones.ENVIO_NUEVO_CANDIDATO_NOPRESENTE, String.valueOf(numeroGestor),
                nif, nombre, hora.toString(), letraCola, Global.panel.haUsadoDNIe ? "_usoDNIe" : "_");
    }

    void crearSalvaPantalla() {
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice[] gs = ge.getScreenDevices();
        GraphicsConfiguration gc = gs[0].getDefaultConfiguration();
        salvaPantalla = new SalvaPantalla();
        if (!conf.cursorVisible) {
            salvaPantalla.setCursor(cursorTransparente);
        }
        Rectangle rec = gc.getBounds();
        salvaPantalla.setBounds(rec);
    }

    public static GraphicsConfiguration dobleMonitor(boolean activar) {
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice[] gs = ge.getScreenDevices();
        int indice = activar ? gs.length - 1 : 0;
        return gs[indice].getDefaultConfiguration();
    }

    void arrancaVentanaPrincipal() {
      //GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        //GraphicsDevice[] gs = ge.getScreenDevices();
        boolean activarDoblePantalla = false;
        if (conf != null) {
            activarDoblePantalla = conf.doblePantalla;
        }
        GraphicsConfiguration gc = dobleMonitor(activarDoblePantalla);
        PanelTactil panel = new PanelTactil(gc);
        if (!conf.cursorVisible) {
            panel.setCursor(cursorTransparente);
        }
        Rectangle rec = gc.getBounds();
        if (conf.enVentana) {
            rec.height = rec.height * 80 / 100;
        }
        panel.setBounds(rec);
        panel.crearBandas();
        Global.panel = panel;
        panel.setVisible(true);
        panel.ponerEnPrimerPlano();
        activarSalvaPantalla();
        if (!conf.enVentana) {
            setExtendedState(JFrame.MAXIMIZED_BOTH);
        }
    }

    public void creaCursorOculto() {
        int[] pixels = new int[16 * 16];
        Image image = Toolkit.getDefaultToolkit().createImage(new java.awt.image.MemoryImageSource(16, 16, pixels, 0, 16));
        cursorTransparente = Toolkit.getDefaultToolkit().createCustomCursor(image, new Point(0, 0), "invisibleCursor");
    }

    public void cerrarAplicacion() {
        try {
            eliminaBloqueoTeclado();
            cerrado = true;
        } catch (Exception exc) {
            log.info("Error cerrando la aplicación");
        } finally {
            System.exit(0);
        }
    }

    public static void reiniciarConScript() {
        try {
            File file = new File("arrancar.vbs");
            PrintStream salida = new PrintStream(new FileOutputStream(file, false));
            salida.println("WScript.sleep 300000");
            salida.println("set shell = wscript.CreateObject(\"wscript.Shell\")");
            salida.println("Set fso = CreateObject(\"Scripting.FileSystemObject\")");
            salida.println("shell.Exec \"" + Configuracion.ficheroEjecucion + "\"");
            salida.println("fso.DeleteFile \"arrancar.vbs\"");
            salida.close();
            Runtime.getRuntime().exec("CSCRIPT arrancar.vbs");
            System.exit(0);
        } catch (Exception exc) {
            exc.printStackTrace();
        }
    }

    public void MsgBox(String msg) {
        JOptionPane.showMessageDialog(this, msg);
    }

    void comenzarAplicacion() {
        if (!args.contiene("desarrollo")) {
            try {
                Runtime.getRuntime().exec("net stop messenger");
            } catch (Exception exc) {
            }
        }
        setLocationRelativeTo(null);
        setVisible(true);
        repaint();
        inicia();
    }

    void mostrarSalvaPantalla() {
        timerSalvaPantalla.stop();
        if (salvaPantalla == null) {
            crearSalvaPantalla();
        }
        salvaPantalla.activar();
        timerSalvaPantalla.start();
    }

    public void activarSalvaPantalla() {
        if (timerSalvaPantalla != null) {
            timerSalvaPantalla.start();
        }
    }

    public void desactivarSalvaPantalla() {
        if (timerSalvaPantalla != null) {
            timerSalvaPantalla.stop();
        }
    }

    public void resetSalvaPantalla() {
        if (timerSalvaPantalla != null) {
            timerSalvaPantalla.restart();
        }
    }

    public void resetMemoria() {
        memoria = memoria + 1;
        if (memoria > 20) {
            memoria = 0;
            Runtime r = Runtime.getRuntime();
            long memlibre = r.freeMemory();

            System.out.println("Memoria libre antes de borrar " + memlibre);
            r.gc();
            memlibre = r.freeMemory();
            System.out.println("Memoria libre despues de borrar " + memlibre);
            r = null;
        }

    }

    public void enviarHora() {
        try {
            Date hora = new Date();
            comunicaciones.enviar(Comunicaciones.ENVIO_HORA, hora.toString(), conf.codigoGestor);
        } catch (Exception exc) {

        }
    }

    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Autoservicio ATENEO");
        setUndecorated(true);
        setResizable(false);

        jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel1.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jLabel1.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        getContentPane().add(jLabel1, java.awt.BorderLayout.CENTER);

        pack();
    }// </editor-fold>//GEN-END:initComponents

    public static void main(final String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                Main sm = new Main();
                sm.args = new Parametros(args);
                if (!sm.args.contiene("ejecutarSinDescargar")) {
                    cargador.Configuracion conf = new cargador.Configuracion();
                    conf.fichero = "Autoservicio.jar";
                    conf.tipoCliente = "6";
                    if (sm.conf.usandoUDP) {
                        conf.nombreServidor = sm.conf.nombreServidor;
                        conf.usandoUDP = true;
                    } else {
                        conf.ipServidor = sm.conf.ipServidor;
                        conf.ipServidorSec = sm.conf.ipServidorSec;
                        conf.ipPortSec = sm.conf.puertoIpServidorSec;
                    }
                    conf.ipPort = sm.conf.puertoIpServidor;
                    CargadorCliente cargador = new CargadorCliente(conf, sm);
                    cargador.lanzar("");
                } else {
                    sm.comenzarAplicacion();
                }
            }
        });
    }

    @Override
    public void lanzaCliente() {
        comenzarAplicacion();
    }

    public class Registro {

        public java.sql.Timestamp horaPresente;
        public String numeroTicket;
        public String cola;
        public java.sql.Timestamp horaCalculada2;
        public String nif;
        public String nombre;
        public int id;
        public java.sql.Timestamp horaCita;

        public Registro(String reg) {
            try {
                leerRegistroCompleto(reg);
            } catch (Exception exc) {
                exc.printStackTrace();
            }
        }

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

        public final void leerRegistroCompleto(String s) throws Exception {
            String[] cs = Global.split(s, '|');
            if (cs.length < 24) {
                throw new Exception("Error en registro seriado: pocos campos (" + cs.length + ")");
            }
            try {
                horaPresente = nzt(cs[7]);
                numeroTicket = cs[11];
                cola = cs[12];

                horaCalculada2 = nzt(cs[8]);
                id = Integer.parseInt(cs[0]);
                nif = cs[1];
                nombre = cs[2];
                horaCita = nzt(cs[3]);
            } catch (Exception exc) {
                throw new Exception("Error en registro seriado: " + exc.getMessage());
            }
        }
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JLabel jLabel1;
    // End of variables declaration//GEN-END:variables
}
