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

public class TModelCandidatosVinculadosManual extends TModelCandidatos {

    java.util.ArrayList<RegistroCandidatos> sacados = new java.util.ArrayList<>(3);

    public TModelCandidatosVinculadosManual(javax.swing.JTable grid) {
        super(grid);
        tabla = new TablaCandidatos();
        ponerOrden(TablaCandidatos.ORDEN_HORACITA);
        grid.setModel(this);
        anchosColumna(0);
        grid.changeSelection(0, 0, false, false);
    }

    private boolean ponerOrden(int columna) {
        switch (columna) {
            case 0:
                tabla.ordena(tabla.obtenerComparador(TablaCandidatos.ORDEN_NOMBRE, true));
                grid.changeSelection(0, 0, false, false);
                break;
            case 2:
                tabla.ordena(tabla.obtenerComparador(TablaCandidatos.ORDEN_HORACITA, true));
                int r = tabla.buscarHora(Fecha.ahora());
                if (r >= 0) {
                    grid.changeSelection(r, 0, false, false);
                }
                break;
            case 3:
                tabla.ordena(tabla.obtenerComparador(TablaCandidatos.ORDEN_VINCULADA, true));
                grid.changeSelection(0, 0, false, false);
                break;
            case 4:
                tabla.ordena(tabla.obtenerComparador(TablaCandidatos.ORDEN_TICKET, true));
                grid.changeSelection(0, 0, false, false);
                break;
        }
        return true;
    }

    public void add(RegistroCandidatos r) {
        if (tabla.buscarPorId(r.id) == null) {
            tabla.copiaRegistro(r);
            ponerOrden(TablaCandidatos.ORDEN_HORACITA);
        }
    }

    public void vaciar() {
        tabla.vaciar();
    }

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

    public RegistroCandidatos HayPresentes() {
        try {
            for(int i=0;i<tabla.recordsCount();i++) {
                RegistroCandidatos r = tabla.getRegistroNum(i);
                if (r.estado.equalsIgnoreCase("P")) {
                    return r;
                }
            }
        } catch (Exception exc) {
        }
        return null;
    }

    public RegistroCandidatos primeroEnHora() {
        return tabla.primeroEnHora();
    }

    public void corregirDatosVinculados(String ticket, RegistroCandidatos origen) {
        int n = tabla.recordsCount();
        for(int i=0;i<n;i++) {
            gestor.datos.RegistroCandidatos r = tabla.getRegistroNum(i);
            r.citaMultiple = n;
            r.horaPresente = origen.horaPresente;
            r.horaCalculada = origen.horaCalculada;
            r.citaVinculada = ticket;
            r.horaCalculada2 = origen.horaCalculada2;
            if (r.id == origen.id) {
                r.numeroTicket = ticket;
                r.estado = "P";
            } else {
                r.numeroTicket = " ";
                r.estado = "X";
            }
        }
    }

    public void recargardatosVinculados(TablaCandidatos fuente) {
        int[] ids = new int[tabla.recordsCount()];
        for(int i=0;i<ids.length;i++) {
            ids[i] = tabla.getRegistroNum(i).id;
        }
        tabla.vaciar();
        for (int i = 0; i < ids.length; i++) {
            tabla.copiaRegistro(fuente.buscarPorId(ids[i]));
        }
    }

    public void enviarCambiosAlServidor() {
        for(int i=0;i<tabla.recordsCount();i++) {
            Global.main.comunicaCambioEstado(tabla.getRegistroNum(i));
        }
        for (RegistroCandidatos sacado : sacados) {
            Global.main.comunicaCambioEstado(sacado);
        }
    }

    public void borrarFila(int fila) {
        RegistroCandidatos reg = tabla.getRegistroNum(fila);
        if (reg.estado.equals("X")) {
            reg.estado = " ";
            reg.citaMultiple = 1;
            sacados.add(reg);
        }
        tabla.eliminar(fila);
    }

    public boolean colaAceptable(String cola) {
        if (tabla.recordsCount() == 0) {
            return true;
        }
        return tabla.getRegistroNum(0).cola.equals(cola);
    }
}
