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

namespace operador
{
    public class ColeccionColas
    {
        Dictionary<string, Registro> tabla;
        static ColeccionColas _yo;
        Configuracion conf;

        public static ColeccionColas unica() {
            return _yo;
        }

        public ColeccionColas() {
            tabla = new Dictionary<string, Registro>(10);
            add(null);
            _yo = this;
            conf = Configuracion.instanciaUnica();
        }

        public void add(string reg) {
            Registro r = new Registro();
            if (reg != null) {
                r.leerRegistroCompleto(reg);
            } 
            tabla[r.cola] = r;
            r.actualizada = true;
        }

        public Registro get(string cola) {
            return tabla[cola];
        }

        public ColaReenvio[] toArray(string colaNoValida) {
            List<ColaReenvio> validos = new List<ColaReenvio>(tabla.Count);
            foreach (Registro reg in tabla.Values) {
                if (reg.activa && !reg.cerrada) {
                    if (reg.cola == "" ) {
                        validos.Add(new ColaReenvio());
                    } else if (reg.cola != colaNoValida) {
                        if (conf.colasInvisibles.Contains(reg.cola)) continue;
                        if(conf.colasVisibles.Count > 0 && !conf.colasVisibles.Contains(reg.cola)) continue;
                        validos.Add(new ColaReenvio(reg.cola, traducirDescripcion(reg.cola, reg.descripcion)));
                    }
                }
            }
            validos.Sort();
            return validos.ToArray();
        }

        string traducirDescripcion(string cola, string descr) {
            return Configuracion.instanciaUnica().nombreDeCola(cola, descr);
        }

        public Registro buscarColaCero(String cola0 ) {
            foreach(Registro r in tabla.Values) {
                if (r.codigoEstadistico == "0" && r.activa && r.cola == cola0 )
                {
                    return r;
                }
            }
            return null;
        }

        internal void marcarTodasNoActualizadas() {
            foreach(Registro r in tabla.Values) {
                if (r.cola != "") {
                    r.actualizada = false;
                }
            }
        }

        internal void borrarNoActualizadas() {
            List<Registro> borrables = new List<Registro>();
            foreach (Registro r in tabla.Values) {
                if (!r.actualizada) borrables.Add(r);
            }
            foreach (Registro r in borrables) {
                tabla.Remove(r.cola);
            }
        }

        public class Registro {
            public string cola = "";
            public string descripcion = "";
            public bool activa = true;
       //     public int tipoNavegacion = 0;
            public bool citaPrevia = false;
            public bool cerrada = false;
            public bool nifObligatorio; 
            public int tiempoMedio = 0;
            public string salaEspera = "";
            public string codigoEstadistico = "";
            public bool especial = false;
            public bool huecosOpe = false;

            public bool actualizada= false;

            public void leerRegistroCompleto(string s) {
                string[] cs = s.Split('|');
                cola = cs[1];
                descripcion = cs[2].Trim();
                activa = (cs[5]== "1") ? true : false;
                //try {
                //    tipoNavegacion = Int32.Parse(cs[6]);
                //} catch (Exception) {}
                citaPrevia = (cs[7]=="1") ? true : false;
                cerrada = (cs[8]=="1") ? true : false;
                try {
                    tiempoMedio = Int32.Parse(cs[10]);
                } catch (Exception) {}
                salaEspera = cs[13].Trim();
                nifObligatorio = (cs[14] == "1") ? true : false;
                codigoEstadistico = cs[6].Trim();
                especial = (cs[15] == "1") ? true : false;
                huecosOpe = (cs[16] == "1") ? true : false;

            }

            public override string ToString() {
                return cola.ToUpper() + " - " + descripcion;
            }
        }
    }
}
