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

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using gestor.utiles;
using System.Collections;
using System.Windows.Forms;
using System.ComponentModel;

namespace minigestor.datos
{
    public class TablaCandidatosVinculados
    {
        List<RegistroCandidatos> sacados = new List<RegistroCandidatos>(3);
        public BindingList<RegistroCandidatos> tabla = new BindingList<RegistroCandidatos>();
        DataGridView grid;
        IComparer<RegistroCandidatos> comparador = new TablaCandidatos.ComparadorHoraCita(true);
        public TablaCandidatosVinculados(DataGridView grid) {
            this.grid = grid;
        }

        bool buscarPorId(int id) {
            foreach (RegistroCandidatos r in tabla) {
                if (r.Id == id) return true;
            }
            return false;
        }

        public void add(RegistroCandidatos r) {
            if (!buscarPorId(r.Id)) {
                tabla.Add(r);
            }
            ordena();
        }

        public void add(TablaCandidatosVinculados tab) {
            foreach (RegistroCandidatos r in tab.tabla) {
                if (!buscarPorId(r.Id)) {
                    tabla.Add(r);
                }
            }
            ordena();
        }

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

        public int Count {
            get {
                return tabla.Count;
            }
        }

        public RegistroCandidatos hayPresentes() {
            try {
                foreach (RegistroCandidatos r in tabla) {
                    if (r.estado == "P") {
                        return r;
                    }
                }
            } catch { }
            return null;
        }

        public RegistroCandidatos primeroEnHora() {
            try {
                long ahoraMismo = Environment.TickCount;
                foreach (RegistroCandidatos reg in tabla) {
                    int r = Global.compruebaHoraCalculada(ahoraMismo, reg.horaCita.Ticks);
                    if (r < 3) {
                        reg.horaCalculada = Global.calcularHora(r, reg.horaCita, ahoraMismo);
                        reg.horaCalculada2 = reg.horaCalculada;
                        return reg;
                    }
                }
            } catch { }
            return null;
        }

        public void corregirDatosVinculados(string ticket, RegistroCandidatos origen) {
            int n = tabla.Count;
            foreach (RegistroCandidatos r in tabla) {
                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 cambiaEstadoVinculados(RegistroCandidatos presente, string nuevoEstado, DateTime horaPresente, DateTime horaCalculada) {
            foreach (RegistroCandidatos r in tabla) {
                if (r != presente) {
                    r.cambiaEstado(nuevoEstado, horaPresente, horaCalculada);
                }
            }
        }

        public void recargarDatosVinculados(TablaCandidatos fuente) {
            int[] ids = new int[tabla.Count];
            for (int i = 0; i < ids.Length; i++) {
                ids[i] = tabla[i].Id;
            }
            vaciar();
            for (int i = 0; i < ids.Length; i++) {
                tabla.Add(fuente.buscarId(ids[i]));
            }
        }

        public void enviarCambiosAlServidor() {
            foreach (RegistroCandidatos r in tabla) {
                Global.gestor.comunicaCambioEstado(r);
            }
            foreach (RegistroCandidatos reg in sacados) {
                Global.gestor.comunicaCambioEstado(reg);
            }
        }

        public void borrarFila(int fila) {
            RegistroCandidatos reg = tabla[fila];
            if (reg.estado == "X") {
                reg.estado = " ";
                reg.citaMultiple = 1;
                sacados.Add(reg);
            }
            tabla.RemoveAt(fila);
        }

        public bool colaAceptable(string cola) {
            if (tabla.Count == 0) {
                return true;
            }
            return tabla[0].cola == cola;
        }

        internal int nifDistintos() {
            List<string> norepes = new List<string>();
            foreach (RegistroCandidatos r in tabla) {
                if (!norepes.Contains(r.nif)) {
                    norepes.Add(r.nif);
                }
            }
            return norepes.Count;
        }

        public void igualarHoraCalculada(DateTime horaCalculada) {
            foreach(RegistroCandidatos reg in tabla) {
                reg.horaCalculada = horaCalculada;
            }
        }

        internal void ordena() {
            RegistroCandidatos[] copia = new RegistroCandidatos[tabla.Count];
            tabla.CopyTo(copia, 0);
            Array.Sort(copia,comparador);
            tabla.Clear();
            foreach (RegistroCandidatos r in copia) {
                tabla.Add(r);
            }
        }
    }
}
