// 
// 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 gestor.utiles;
using ateneo.utiles;

namespace minigestor.datos
{
    public class RegistroCandidatos : global::System.Data.DataRow
    {
        private CandidatosDataTable tableCandidatos;

        internal RegistroCandidatos(global::System.Data.DataRowBuilder rb)
            :
            base(rb) {
            this.tableCandidatos = ((CandidatosDataTable)(this.Table));
        }
        public int Id {
            get {
                return ((int)(this[this.tableCandidatos.columnId]));
            }
            set {
                this[this.tableCandidatos.columnId] = value;
            }
        }

        public string nif {
            get {
                try {
                    return ((string)(this[this.tableCandidatos.columnNif]));
                } catch (global::System.InvalidCastException e) {
                    throw new global::System.Data.StrongTypingException("El valor de la columna \'Nif\' de la tabla \'Candidatos\' es DBNull.", e);
                }
            }
            set {
                this[this.tableCandidatos.columnNif] = value;
            }
        }

        public string nombre {
            get {
                try {
                    return ((string)(this[this.tableCandidatos.columnNombre]));
                } catch (global::System.InvalidCastException e) {
                    throw new global::System.Data.StrongTypingException("El valor de la columna \'Nombre\' de la tabla \'Candidatos\' es DBNull.", e);
                }
            }
            set {
                this[this.tableCandidatos.columnNombre] = value;
            }
        }

        public System.DateTime horaCita {
            get {
                try {
                    return ((global::System.DateTime)(this[this.tableCandidatos.columnHoraCita]));
                } catch (global::System.InvalidCastException e) {
                    throw new global::System.Data.StrongTypingException("El valor de la columna \'HoraCita\' de la tabla \'Candidatos\' es DBNull.", e);
                }
            }
            set {
                this[this.tableCandidatos.columnHoraCita] = value;
            }
        }

        public string estado {
            get {
                if (IsNull(this.tableCandidatos.columnEstado)) return "";
                return ((string)(this[this.tableCandidatos.columnEstado]));
            }
            set {
                this[this.tableCandidatos.columnEstado] = value;
            }
        }

        public System.DateTime horaCalculada {
            get {
                try {
                    return ((global::System.DateTime)(this[this.tableCandidatos.columnHoraCalculada]));
                } catch (global::System.InvalidCastException e) {
                    throw new global::System.Data.StrongTypingException("El valor de la columna \'HoraCalculada\' de la tabla \'Candidatos\' es DBNull.", e);
                }
            }
            set {
                this[this.tableCandidatos.columnHoraCalculada] = value;
            }
        }

        public System.DateTime horaAtendido {
            get {
                try {
                    return ((global::System.DateTime)(this[this.tableCandidatos.columnHoraAtendido]));
                } catch (global::System.InvalidCastException e) {
                    throw new global::System.Data.StrongTypingException("El valor de la columna \'HoraAtendido\' de la tabla \'Candidatos\' es DBNull.", e);
                }
            }
            set {
                this[this.tableCandidatos.columnHoraAtendido] = value;
            }
        }

        public System.DateTime horaPresente {
            get {
                try {
                    return ((global::System.DateTime)(this[this.tableCandidatos.columnHoraPresente]));
                } catch (global::System.InvalidCastException e) {
                    throw new global::System.Data.StrongTypingException("El valor de la columna \'HoraPresente\' de la tabla \'Candidatos\' es DBNull.", e);
                }
            }
            set {
                this[this.tableCandidatos.columnHoraPresente] = value;
            }
        }

        public System.DateTime horaCalculada2 {
            get {
                try {
                    return ((global::System.DateTime)(this[this.tableCandidatos.columnHoraCalculada2]));
                } catch (global::System.InvalidCastException e) {
                    throw new global::System.Data.StrongTypingException("El valor de la columna \'HoraCalculada2\' de la tabla \'Candidatos\' es DBNull.", e);
                }
            }
            set {
                this[this.tableCandidatos.columnHoraCalculada2] = value;
            }
        }

        public System.DateTime horaEstimada {
            get {
                try {
                    return ((global::System.DateTime)(this[this.tableCandidatos.columnHoraEstimada]));
                } catch (global::System.InvalidCastException e) {
                    throw new global::System.Data.StrongTypingException("El valor de la columna \'HoraEstimada\' de la tabla \'Candidatos\' es DBNull.", e);
                }
            }
            set {
                this[this.tableCandidatos.columnHoraEstimada] = value;
            }
        }
        public string turno {
            get {
                if (IsNull(this.tableCandidatos.columnTurno)) return "";
                return ((string)(this[this.tableCandidatos.columnTurno]));
            }
            set {
                this[this.tableCandidatos.columnTurno] = value;
            }
        }

        public int citaMultiple {
            get {
                if (IsNull(this.tableCandidatos.columnCitaMultiple)) return 0;
                return ((int)(this[this.tableCandidatos.columnCitaMultiple]));
            }
            set {
                this[this.tableCandidatos.columnCitaMultiple] = value;
            }
        }

        public string numeroTicket {
            get {
                if (IsNull(this.tableCandidatos.columnNumeroTicket)) return "";
                return ((string)(this[this.tableCandidatos.columnNumeroTicket]));
            }
            set {
                this[this.tableCandidatos.columnNumeroTicket] = value;
                this[this.tableCandidatos.columnFalsoTicket] = creaFalsoTicket(value);
            }
        }

        public string cola {
            get {
                try {
                    return ((string)(this[this.tableCandidatos.columnCola]));
                } catch (global::System.InvalidCastException e) {
                    throw new global::System.Data.StrongTypingException("El valor de la columna \'Cola\' de la tabla \'Candidatos\' es DBNull.", e);
                }
            }
            set {
                this[this.tableCandidatos.columnCola] = value;
            }
        }

        public string operador {
            get {
                if (IsNull(this.tableCandidatos.columnOperador)) return "";
                return ((string)(this[this.tableCandidatos.columnOperador]));
            }
            set {
                this[this.tableCandidatos.columnOperador] = value;
            }
        }

        public System.DateTime horaFinalizado {
            get {
                try {
                    return ((global::System.DateTime)(this[this.tableCandidatos.columnHoraFinalizado]));
                } catch (global::System.InvalidCastException e) {
                    throw new global::System.Data.StrongTypingException("El valor de la columna \'HoraFinalizado\' de la tabla \'Candidatos\' es DBNull.", e);
                }
            }
            set {
                this[this.tableCandidatos.columnHoraFinalizado] = value;
            }
        }

        public string codigoEstadistico {
            get {
                try {
                    return ((string)(this[this.tableCandidatos.columnCodigoEstadistico]));
                } catch (global::System.InvalidCastException e) {
                    throw new global::System.Data.StrongTypingException("El valor de la columna \'CodigoEstadistico\' de la tabla \'Candidatos\' es DBNull.", e);
                }
            }
            set {
                this[this.tableCandidatos.columnCodigoEstadistico] = value;
            }
        }

        public string citaVinculada {
            get {
                if (IsNull(this.tableCandidatos.columnCitaVinculada)) return "";
                return ((string)(this[this.tableCandidatos.columnCitaVinculada]));
            }
            set {
                this[this.tableCandidatos.columnCitaVinculada] = value;
            }
        }

        public string codigoGestor {
            get {
                if (IsNull(this.tableCandidatos.columnCodigoGestor)) return "";
                return ((string)(this[this.tableCandidatos.columnCodigoGestor]));
            }
            set {
                this[this.tableCandidatos.columnCodigoGestor] = value;
            }
        }

        public string NIU {
            get {
                if (IsNull(this.tableCandidatos.columnNIU)) return "";
                return ((string)(this[this.tableCandidatos.columnNIU]));
            }
            set {
                this[this.tableCandidatos.columnNIU] = value;
            }
        }

        public string mesa {
            get {
                if (IsNull(this.tableCandidatos.columnMesa)) return "";
                return ((string)(this[this.tableCandidatos.columnMesa]));
            }
            set {
                this[this.tableCandidatos.columnMesa] = value;
            }
        }

        public string falsoTicket {
            get {
                if (IsNull(this.tableCandidatos.columnFalsoTicket)) return "";
                return ((string)(this[this.tableCandidatos.columnFalsoTicket]));
            }
        }

        internal void leerRegistroCompleto(string s) {
            string[] cs = s.Split('|');
            if (cs.Length < 19) {
                throw new Exception("Error en registro seriado: pocos campos (" + cs.Length + ")");
            }
            try {
                Id = Int32.Parse(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];
                mesa = cs[19];
                NIU = cs[18];
                horaEstimada = Global.nzt(cs[20]);
            } catch (Exception exc) {
                throw new Exception("Error en registroCandidatos seriado: " + exc.Message);
            }
        }

        internal void leerRegistroCompleto(RegistroCandidatos r) {
            Id = r.Id;
            nif = r.nif;
            nombre = r.nombre;
            horaCita = r.horaCita;
            estado = r.estado;
            horaCalculada = r.horaCalculada;
            horaAtendido = r.horaAtendido;
            horaPresente = r.horaPresente;
            horaCalculada2 = r.horaCalculada2;
            turno = r.turno;
            citaMultiple = r.citaMultiple;
            numeroTicket = r.numeroTicket;
            cola = r.cola;
            operador = r.operador;
            horaFinalizado = r.horaFinalizado;
            codigoEstadistico = r.codigoEstadistico;
            citaVinculada = r.citaVinculada;
            codigoGestor = r.codigoGestor;
            mesa = r.mesa;
            NIU = r.NIU;
            horaEstimada = r.horaEstimada;
        }

        public override string ToString() {
            StringBuilder buf = new StringBuilder();
            try {
                buf.Append(Id.ToString()).Append('|');
                buf.Append(nif).Append('|');
                buf.Append(nombre).Append('|');
                buf.Append(Fecha.javaTimeStamp(horaCita)).Append('|');
                buf.Append(estado).Append('|');
                buf.Append(Fecha.javaTimeStamp(horaCalculada)).Append('|');
                buf.Append(Fecha.javaTimeStamp(horaAtendido)).Append('|');
                buf.Append(Fecha.javaTimeStamp(horaPresente)).Append('|');
                buf.Append(Fecha.javaTimeStamp(horaCalculada2)).Append('|');
                buf.Append(turno).Append('|');
                buf.Append(citaMultiple.ToString()).Append('|');
                buf.Append(numeroTicket).Append('|');
                buf.Append(cola).Append('|');
                buf.Append(operador).Append('|');
                buf.Append(Fecha.javaTimeStamp(horaFinalizado)).Append('|');
                buf.Append(codigoEstadistico).Append('|');
                buf.Append(citaVinculada).Append('|');
                buf.Append(codigoGestor).Append('|');
                buf.Append(mesa).Append('|');
                buf.Append(NIU);
            } catch (Exception exc) {
                LogExcepcion.guardar("Error en RegistroCandidatos.ToString", exc);
            }
            return buf.ToString();
        }

        const string ceros = "00";
        private string creaFalsoTicket(string p) {
            if (p.Trim() == "") return "";
            string[] pp = p.Split('-');
            if (pp.Length < 2) return p;
            string r = pp[0] + "-" + ceros.Substring(0, 3 - pp[1].Length) + pp[1];
            return r;
        }


        internal void cambiaEstado(string estado, DateTime horaPresente, DateTime horaCalculada) {
            this.estado = estado;
            if (estado == " ") {
                numeroTicket = " ";
                this.horaPresente = Fecha.fechaVacia;
                this.horaCalculada = Fecha.fechaVacia;
            } else {
                this.horaPresente = horaPresente;
                this.horaCalculada = horaCalculada;
            }
            if (estado == " " || estado == "P") {
                mesa = " ";
            }
            Global.gestor.comunicaCambioEstado(this);
        }

        public void forzarEstado(string estado) {
            this.estado = estado;
            mesa = " ";
            Global.gestor.comunicaCambioEstado(this);
        }

        public bool tieneTicket() {
            return numeroTicket.Trim().Length > 2;
        }

        public bool estadoVacio() {
            return estado.CompareTo("A") < 0;
        }

        public bool esCitaPrevia() {
            return NIU.Trim().Length > 7;
        }

    }
}
