using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Collections.ObjectModel;


namespace AplicacionEstadisticas
{
    public class MainViewModel : INotifyPropertyChanged
    {
        public MainViewModel()
        {
            this.Items = new ObservableCollection<ItemViewModel>();     // Coleccion no usada
            
            //Estados
            this.Estados = new ObservableCollection<ItemViewModel>();       // Coleccion para los estados
            this.Estados_llaves = new ObservableCollection<Int32>();        // Coleccion para los estados con mas llaves
            this.Estados_llaves_menos = new ObservableCollection<Int32>();  // Coleccion para los estados con menos llaves

            //Institucion
            this.Institucion = new ObservableCollection<ItemViewModel>();       // Coleccion para las instituciones
            this.Institucion_llaves = new ObservableCollection<Int32>();        // Coleccion para las instituciones con mas llaves
            this.Institucion_llaves_menos = new ObservableCollection<Int32>();  // Coleccion para los instituciones con menos llaves

            //Mes
            this.Meses = new ObservableCollection<ItemViewModel>();         // Coleccion para los meses
            this.Meses_llaves = new ObservableCollection<Int32>();          // Coleccion para los meses con mas llaves
            this.Meses_llaves_menos = new ObservableCollection<Int32>();    // Coleccion para los meses con menos llaves

            this.NombreDeEstado = new ObservableCollection<EstadosViewModel>();             // Coleccion para guardar los nombres de los estados
            this.NombreDeInstitucion = new ObservableCollection<InstitucionesViewModel>();  // Coleccion para guardar los nombres de las instituciones
            this.NombreDeMes = new ObservableCollection<MesesViewModel>();                  // Coleccion para guardar los nombres de los meses

        }

        /// <summary>
        /// A collection for ItemViewModel objects: Estados, Institucion, Meses.
        /// </summary>
        public ObservableCollection<ItemViewModel> Items { get; private set; }
        //Estados
        public ObservableCollection<ItemViewModel> Estados { get; private set; }
        public ObservableCollection<Int32> Estados_llaves { get; private set; }
        public ObservableCollection<Int32> Estados_llaves_menos { get; private set; }
        //Institucion
        public ObservableCollection<ItemViewModel> Institucion { get; private set; }
        public ObservableCollection<Int32> Institucion_llaves { get; private set; }
        public ObservableCollection<Int32> Institucion_llaves_menos { get; private set; }
        //Meses
        public ObservableCollection<ItemViewModel> Meses { get; private set; }
        public ObservableCollection<Int32> Meses_llaves { get; private set; }
        public ObservableCollection<Int32> Meses_llaves_menos { get; private set; }
        //Nombres de estados
        public ObservableCollection<EstadosViewModel> NombreDeEstado { get; private set; }
        public ObservableCollection<InstitucionesViewModel> NombreDeInstitucion { get; private set; }
        public ObservableCollection<MesesViewModel> NombreDeMes { get; private set; }

        private string _sampleProperty = "Sample Runtime Property Value";
        /// <summary>
        /// Sample ViewModel property; this property is used in the view to display its value using a Binding
        /// </summary>
        /// <returns></returns>
        public string SampleProperty
        {
            get
            {
                return _sampleProperty;
            }
            set
            {
                if (value != _sampleProperty)
                {
                    _sampleProperty = value;
                    NotifyPropertyChanged("SampleProperty");
                }
            }
        }

        public bool IsDataLoaded
        {
            get;
            private set;
        }

        /// <summary>
        /// Creates and adds a few ItemViewModel objects into the Items collection.
        /// </summary>
        /// 
        public void LoadData(DateTime fechaEstado, Boolean ds_fc)
        {
            WebServiceItesm.WebServiceVinculacionSoapClient cliente = new WebServiceItesm.WebServiceVinculacionSoapClient();
            if (ds_fc)
            {
                cliente.keysPerStateCompleted += new EventHandler<WebServiceItesm.keysPerStateCompletedEventArgs>(cliente_keysPerStateCompleted);
                cliente.keysPerStateAsync(fechaEstado.Year);
            }
            else 
            {
                cliente.FCkeysPerStateCompleted += new EventHandler<WebServiceItesm.FCkeysPerStateCompletedEventArgs>(cliente_FCkeysPerStateCompleted);
                cliente.FCkeysPerStateAsync(fechaEstado.Year);
            }

            this.IsDataLoaded = true;
        }

        /// <summary>
        /// Creates and adds a few ItemViewModel objects into the Items collection.
        /// </summary>
        /// 
        public void LoadDataInstitucion(DateTime fechaInstitucion, Boolean ds_fc)
        {
            WebServiceItesm.WebServiceVinculacionSoapClient cliente = new WebServiceItesm.WebServiceVinculacionSoapClient();
            if (ds_fc)
            {
                cliente.keysPerInstitutionCompleted += new EventHandler<WebServiceItesm.keysPerInstitutionCompletedEventArgs>(cliente_keysPerInstitutionCompleted);
                cliente.keysPerInstitutionAsync(fechaInstitucion.Year);
            }
            else
            {
                cliente.FCkeysPerInstitutionCompleted += new EventHandler<WebServiceItesm.FCkeysPerInstitutionCompletedEventArgs>(cliente_FCkeysPerInstitutionCompleted);
                cliente.FCkeysPerInstitutionAsync(fechaInstitucion.Year);
            }

        }

        /// <summary>
        /// Creates and adds a few ItemViewModel objects into the Items collection.
        /// </summary>
        /// 
        public void LoadDataMes(DateTime fechaMes, Boolean ds_fc)
        {
            WebServiceItesm.WebServiceVinculacionSoapClient cliente = new WebServiceItesm.WebServiceVinculacionSoapClient();
            if (ds_fc)
            {
                cliente.keysPerMonthCompleted += new EventHandler<WebServiceItesm.keysPerMonthCompletedEventArgs>(cliente_keysPerMonthCompleted);
                cliente.keysPerMonthAsync(fechaMes.Year);
            }
            else
            {
                cliente.FCkeysPerMonthCompleted += new EventHandler<WebServiceItesm.FCkeysPerMonthCompletedEventArgs>(cliente_FCkeysPerMonthCompleted);
                cliente.FCkeysPerMonthAsync(fechaMes.Year);
            }
        }

        //Implementacion por Mes
        //Metodo de llaves por mes de Faculty Connection
        void cliente_FCkeysPerMonthCompleted(object sender, WebServiceItesm.FCkeysPerMonthCompletedEventArgs e)
        {
            // Vacia las colecciones
            Meses.Clear();
            Meses_llaves.Clear();
            Meses_llaves_menos.Clear();
            NombreDeMes.Clear();

            //Inicializa las variables con los nombres de los estados y las llaves
            string[] str_meses = { "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre" };
            int[] dk_meses = new int[12];
            for (int i = 0; i < e.Result.Count; i++)
            {
                // Guarda los valores en el arreglo de llaves por mes
                dk_meses[i] = e.Result[i];
                //this.Meses.Add(new ItemViewModel() { LineOne = str_meses[i], LineTwo = "Llaves de faculty adquiridas: " + dk_meses[i].ToString() });
            }

            // Ordenar el arreglo de llaves por mes
            for (int i = 0; i < e.Result.Count; i++)
            {
                int temporal = 0;
                string str_temp = "";
                for (int j = i + 1; j < e.Result.Count; j++)
                {

                    if (dk_meses[i] >= dk_meses[j])
                    {
                        temporal = dk_meses[i];
                        dk_meses[i] = dk_meses[j];
                        dk_meses[j] = temporal;

                        str_temp = str_meses[i];
                        str_meses[i] = str_meses[j];
                        str_meses[j] = str_temp;

                    }
                }
            }

            // Agrega los datos ordenados a la coleccion de meses
            {
                int l = e.Result.Count - 1;
                for (int i = 0; i <= l; i++)
                    this.Meses.Add(new ItemViewModel() { LineOne = str_meses[l - i], LineTwo = "Llaves de faculty adquiridas: " + dk_meses[l - i].ToString() });
            }
            this.NombreDeMes.Add(new MesesViewModel() { LineOne = "1. " + str_meses[e.Result.Count - 1] + ": " + dk_meses[e.Result.Count - 1], LineTwo = "2. " + str_meses[e.Result.Count - 2] + ": " + dk_meses[e.Result.Count - 2], LineThree = "3. " + str_meses[e.Result.Count - 3] + ": " + dk_meses[e.Result.Count - 3], LineFour = "1. " + str_meses[0] + ": " + dk_meses[0], LineFive = "2. " + str_meses[1] + ": " + dk_meses[1], LineSix = "3. " + str_meses[2] + ": " + dk_meses[2] });

            //Agregar los 3 estados con MENOS llaves asignadas
            this.Meses_llaves_menos.Add(dk_meses[0]);
            this.Meses_llaves_menos.Add(dk_meses[1]);
            this.Meses_llaves_menos.Add(dk_meses[2]);

            //Agregar los 3 estados con MAS llaves asignadas
            this.Meses_llaves.Add(dk_meses[e.Result.Count - 1]);
            this.Meses_llaves.Add(dk_meses[e.Result.Count - 2]);
            this.Meses_llaves.Add(dk_meses[e.Result.Count - 3]);
        }

        //Metodo de llaves por mes de DreamSpark
        void cliente_keysPerMonthCompleted(object sender, WebServiceItesm.keysPerMonthCompletedEventArgs e)
        {
            // Vacia las colecciones
            Meses.Clear();
            Meses_llaves.Clear();
            Meses_llaves_menos.Clear();
            NombreDeMes.Clear();

            //Inicializa las variables con los nombres de los estados y las llaves
            string[] str_meses = { "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre" };
            int[] dk_meses = new int[12];
            for (int i = 0; i < e.Result.Count; i++)
            {
                // Guarda los valores en el arreglo de llaves por mes
                dk_meses[i] = e.Result[i];
                //this.Meses.Add(new ItemViewModel() { LineOne = str_meses[i], LineTwo = "Llaves de dreamspark adquiridas: " + dk_meses[i].ToString() });
            }
            //// Valores para debuggear---------
            //dk_meses[0] = 20;
            //dk_meses[1] = 43;
            //dk_meses[2] = 10;
            //dk_meses[3] = 33;
            //dk_meses[4] = 60;

            ////--------------------------

            ////Ordenar el arreglo
            //Array.Sort(dk_meses);
            //dk_meses[0] = 1;
            //dk_meses[1] = 2;
            //dk_meses[2] = 3;

            // Ordenar el arreglo de llaves por mes
            for (int i = 0; i < e.Result.Count; i++)
            {
                int temporal = 0;
                string str_temp = "";
                for (int j = i + 1; j < e.Result.Count; j++)
                {

                    if (dk_meses[i] >= dk_meses[j])
                    {
                        temporal = dk_meses[i];
                        dk_meses[i] = dk_meses[j];
                        dk_meses[j] = temporal;

                        str_temp = str_meses[i];
                        str_meses[i] = str_meses[j];
                        str_meses[j] = str_temp;

                    }
                }
            }

            // Agrega los datos ordenados a la coleccion de meses
            {
                int l = e.Result.Count - 1;
                for (int i = 0; i <= l; i++)
                    this.Meses.Add(new ItemViewModel() { LineOne = str_meses[l - i], LineTwo = "Llaves de dreamspark adquiridas: " + dk_meses[l - i].ToString() });
            }
            this.NombreDeMes.Add(new MesesViewModel() { LineOne = "1. " + str_meses[e.Result.Count - 1] + ": " + dk_meses[e.Result.Count - 1], LineTwo = "2. " + str_meses[e.Result.Count - 2] + ": " + dk_meses[e.Result.Count - 2], LineThree = "3. " + str_meses[e.Result.Count - 3] + ": " + dk_meses[e.Result.Count - 3], LineFour = "1. " + str_meses[0] + ": " + dk_meses[0], LineFive = "2. " + str_meses[1] + ": " + dk_meses[1], LineSix = "3. " + str_meses[2] + ": " + dk_meses[2] });

            //Agregar los 3 estados con MENOS llaves asignadas
            this.Meses_llaves_menos.Add(dk_meses[0]);
            this.Meses_llaves_menos.Add(dk_meses[1]);
            this.Meses_llaves_menos.Add(dk_meses[2]);

            //Agregar los 3 estados con MAS llaves asignadas
            this.Meses_llaves.Add(dk_meses[e.Result.Count - 1]);
            this.Meses_llaves.Add(dk_meses[e.Result.Count - 2]);
            this.Meses_llaves.Add(dk_meses[e.Result.Count - 3]);


        }

        //Implementacion por Institucion
        //Metodo de llaves por institucion de Faculty Connection
        void cliente_FCkeysPerInstitutionCompleted(object sender, WebServiceItesm.FCkeysPerInstitutionCompletedEventArgs e)
        {
            // Vacia las colecciones
            Institucion.Clear();
            Institucion_llaves.Clear();
            Institucion_llaves_menos.Clear();
            NombreDeInstitucion.Clear();

            //Inicializa las variables con los nombres de los estados y las llaves
            string[] str_Institucion = new string[e.Result.Count];
            int[] dk_instituciones = new int[e.Result.Count];

            if (e.Result.Count == 0)
            {
                this.Institucion.Add(new ItemViewModel() { LineOne = "", LineTwo = "No se encontraron datos que coincidan con el tipo de llave y/o el año seleccionado." });
            }
            for (int i = 0; i < e.Result.Count; i++)
            {

                string[] valores = e.Result[i].Split('\t');
                str_Institucion[i] = valores[0];

                // Guarda los valores en el arreglo de llaves por institucion
                dk_instituciones[i] = int.Parse(valores[1]);

                //this.Institucion.Add(new ItemViewModel() { LineOne = str_Institucion[i], LineTwo = "Llaves de faculty adquiridas: " + dk_instituciones[i].ToString() });
            }

            // Ordenar el arreglo de llaves por institucion
            for (int i = 0; i < e.Result.Count; i++)
            {
                int temporal = 0;
                string str_temp = "";
                for (int j = i + 1; j < e.Result.Count; j++)
                {

                    if (dk_instituciones[i] > dk_instituciones[j])
                    {
                        temporal = dk_instituciones[i];
                        dk_instituciones[i] = dk_instituciones[j];
                        dk_instituciones[j] = temporal;

                        str_temp = str_Institucion[i];
                        str_Institucion[i] = str_Institucion[j];
                        str_Institucion[j] = str_temp;

                    }
                }
            }

            // Agrega los datos ordenados a la coleccion de instituciones
            {
                int l = e.Result.Count - 1;
                for (int i = 0; i <= l; i++)
                    this.Institucion.Add(new ItemViewModel() { LineOne = str_Institucion[l - i], LineTwo = "Llaves de faculty adquiridas: " + dk_instituciones[l - i].ToString() });
            }

            if (e.Result.Count > 2) this.NombreDeInstitucion.Add(new InstitucionesViewModel() { LineOne = "1. " + str_Institucion[e.Result.Count - 1] + ": " + dk_instituciones[e.Result.Count - 1], LineTwo = "2. " + str_Institucion[e.Result.Count - 2] + ": " + dk_instituciones[e.Result.Count - 2], LineThree = "3. " + str_Institucion[e.Result.Count - 3] + ": " + dk_instituciones[e.Result.Count - 3], LineFour = "1. " + str_Institucion[0] + ": " + dk_instituciones[0], LineFive = "2. " + str_Institucion[1] + ": " + dk_instituciones[1], LineSix = "3. " + str_Institucion[2] + ": " + dk_instituciones[2] });
            else if (e.Result.Count > 1) this.NombreDeInstitucion.Add(new InstitucionesViewModel() { LineOne = "1. " + str_Institucion[e.Result.Count - 1] + ": " + dk_instituciones[e.Result.Count - 1], LineTwo = "2. " + str_Institucion[e.Result.Count - 2] + ": " + dk_instituciones[e.Result.Count - 2], LineThree = "", LineFour = "1. " + str_Institucion[0] + ": " + dk_instituciones[0], LineFive = "2. " + str_Institucion[1] + ": " + dk_instituciones[1], LineSix = "" });
            else if (e.Result.Count > 0) this.NombreDeInstitucion.Add(new InstitucionesViewModel() { LineOne = "1. " + str_Institucion[e.Result.Count - 1] + ": " + dk_instituciones[e.Result.Count - 1], LineTwo = "", LineThree = "", LineFour = "1. " + str_Institucion[0] + ": " + dk_instituciones[0], LineFive = "", LineSix = "" });
            else this.NombreDeInstitucion.Add(new InstitucionesViewModel() { LineOne = "No se encontraron datos que coincidan con el tipo de llave y/o el año seleccionado.", LineTwo = "", LineThree = "", LineFour = "No se encontraron datos que coincidan con el tipo de llave y/o el año seleccionado.", LineFive = "", LineSix = "" });

            //Agregar los 3 estados con MENOS llaves asignadas
            if (e.Result.Count > 0) this.Institucion_llaves_menos.Add(dk_instituciones[0]);
            if (e.Result.Count > 1) this.Institucion_llaves_menos.Add(dk_instituciones[1]);
            if (e.Result.Count > 2) this.Institucion_llaves_menos.Add(dk_instituciones[2]);
            //MessageBox.Show("" + dk_estados[0] + " " + dk_estados[1] + " " + dk_estados[2]);
            //MessageBox.Show("" + dk_estados[e.Result.Count - 3] + " " + dk_estados[e.Result.Count - 2] + " " + dk_estados[e.Result.Count - 1]);

            //Agregar los 3 estados con MAS llaves asignadas
            if (e.Result.Count > 0) this.Institucion_llaves.Add(dk_instituciones[e.Result.Count - 1]);
            if (e.Result.Count > 1) this.Institucion_llaves.Add(dk_instituciones[e.Result.Count - 2]);
            if (e.Result.Count > 2) this.Institucion_llaves.Add(dk_instituciones[e.Result.Count - 3]);
        }

        //Metodo de llaves por institucion de DreamSpark
        void cliente_keysPerInstitutionCompleted(object sender, WebServiceItesm.keysPerInstitutionCompletedEventArgs e)//Implementar DK Institucion
        {
            // Vacia las colecciones
            Institucion.Clear();
            Institucion_llaves.Clear();
            Institucion_llaves_menos.Clear();
            NombreDeInstitucion.Clear();

            //Inicializa las variables con los nombres de los estados y las llaves
            string[] str_Institucion = new string[e.Result.Count];
            int[] dk_instituciones = new int[e.Result.Count];

            if (e.Result.Count == 0)
            {
                this.Institucion.Add(new ItemViewModel() { LineOne = "", LineTwo = "No se encontraron datos que coincidan con el tipo de llave y/o el año seleccionado." });
            }
            for (int i = 0; i < e.Result.Count; i++)
            {

                string[] valores = e.Result[i].Split('\t');
                str_Institucion[i] = valores[0];

                // Guarda los valores en el arreglo de llaves por institucion
                dk_instituciones[i] = int.Parse(valores[1]);

                //this.Institucion.Add(new ItemViewModel() { LineOne = str_Institucion[i], LineTwo = "Llaves de dreamspark adquiridas: " + dk_instituciones[i].ToString() });
            }

            // Ordenar el arreglo de llaves por institucion
            for (int i = 0; i < e.Result.Count; i++)
            {
                int temporal = 0;
                string str_temp = "";
                for (int j = i + 1; j < e.Result.Count; j++)
                {

                    if (dk_instituciones[i] > dk_instituciones[j])
                    {
                        temporal = dk_instituciones[i];
                        dk_instituciones[i] = dk_instituciones[j];
                        dk_instituciones[j] = temporal;

                        str_temp = str_Institucion[i];
                        str_Institucion[i] = str_Institucion[j];
                        str_Institucion[j] = str_temp;

                    }
                }
            }

            // Agrega los datos ordenados a la coleccion de instituciones
            {
                int l = e.Result.Count - 1;
                for (int i = 0; i <= l; i++)
                    this.Institucion.Add(new ItemViewModel() { LineOne = str_Institucion[l - i], LineTwo = "Llaves de dreamspark adquiridas: " + dk_instituciones[l - i].ToString() });
            }

            if (e.Result.Count > 2) this.NombreDeInstitucion.Add(new InstitucionesViewModel() { LineOne = "1. " + str_Institucion[e.Result.Count - 1] + ": " + dk_instituciones[e.Result.Count - 1], LineTwo = "2. " + str_Institucion[e.Result.Count - 2] + ": " + dk_instituciones[e.Result.Count - 2], LineThree = "3. " + str_Institucion[e.Result.Count - 3] + ": " + dk_instituciones[e.Result.Count - 3], LineFour = "1. " + str_Institucion[0] + ": " + dk_instituciones[0], LineFive = "2. " + str_Institucion[1] + ": " + dk_instituciones[1], LineSix = "3. " + str_Institucion[2] + ": " + dk_instituciones[2] });
            else if (e.Result.Count > 1) this.NombreDeInstitucion.Add(new InstitucionesViewModel() { LineOne = "1. " + str_Institucion[e.Result.Count - 1] + ": " + dk_instituciones[e.Result.Count - 1], LineTwo = "2. " + str_Institucion[e.Result.Count - 2] + ": " + dk_instituciones[e.Result.Count - 2], LineThree = "", LineFour = "1. " + str_Institucion[0] + ": " + dk_instituciones[0], LineFive = "2. " + str_Institucion[1] + ": " + dk_instituciones[1], LineSix = "" });
            else if (e.Result.Count > 0) this.NombreDeInstitucion.Add(new InstitucionesViewModel() { LineOne = "1. " + str_Institucion[e.Result.Count - 1] + ": " + dk_instituciones[e.Result.Count - 1], LineTwo = "", LineThree = "", LineFour = "1. " + str_Institucion[0] + ": " + dk_instituciones[0], LineFive = "", LineSix = "" });
            else this.NombreDeInstitucion.Add(new InstitucionesViewModel() { LineOne = "No se encontraron datos que coincidan con el tipo de llave y/o el año seleccionado.", LineTwo = "", LineThree = "", LineFour = "No se encontraron datos que coincidan con el tipo de llave y/o el año seleccionado.", LineFive = "", LineSix = "" });

            //Agregar las 3 instituciones con MENOS llaves asignadas
            if (e.Result.Count > 0) this.Institucion_llaves_menos.Add(dk_instituciones[0]);
            if (e.Result.Count > 1) this.Institucion_llaves_menos.Add(dk_instituciones[1]); else this.Institucion_llaves_menos.Add(0);
            if (e.Result.Count > 2) this.Institucion_llaves_menos.Add(dk_instituciones[2]);
            //MessageBox.Show("" + dk_estados[0] + " " + dk_estados[1] + " " + dk_estados[2]);
            //MessageBox.Show("" + dk_estados[e.Result.Count - 3] + " " + dk_estados[e.Result.Count - 2] + " " + dk_estados[e.Result.Count - 1]);

            //Agregar las 3 instituciones con MAS llaves asignadas
            if (e.Result.Count > 0) this.Institucion_llaves.Add(dk_instituciones[e.Result.Count - 1]);
            if (e.Result.Count > 1) this.Institucion_llaves.Add(dk_instituciones[e.Result.Count - 2]); else this.Institucion_llaves.Add(0);
            if (e.Result.Count > 2) this.Institucion_llaves.Add(dk_instituciones[e.Result.Count - 3]);
        }

        //Implementacion por estado
        //Metodo de llaves por estado de Faculty Connection
        void cliente_FCkeysPerStateCompleted(object sender, WebServiceItesm.FCkeysPerStateCompletedEventArgs e)
        {
            // Vacia las colecciones
            Estados.Clear();
            Estados_llaves.Clear();
            Estados_llaves_menos.Clear();
            NombreDeEstado.Clear();

            //Inicializa las variables con los nombres de los estados y las llaves
            string[] str_estados = { "Aguascalientes", "Baja California", "Baja California Sur", "Campeche", "Chiapas", "Chihuahua", "Coahuila", "Colima", "Distrito Federal", "Durango", "Guanajuato", "Guerrero", "Hidalgo", "Jalisco", "México", "Michoacán", "Morelos", "Nayarit", "Nuevo León", "Oaxaca", "Puebla", "Querétaro", "Quintana Roo", "San Luis Potosí", "Sinaloa", "Sonora", "Tabasco", "Tamaulipas", "Tlaxcala", "Veracruz", "Yucatán", "Zacatecas" };
            int[] dk_estados = new int[32];
            for (int i = 0; i < e.Result.Count; i++)
            {
                // Guarda los valores en el arreglo de llaves por estado
                dk_estados[i] = e.Result[i];
                //this.Estados.Add(new ItemViewModel() { LineOne = str_estados[i], LineTwo = "Llaves de faculty adquiridas: " + dk_estados[i].ToString() });
            }
            //// Valores para debuggear---------
            //dk_estados[0] = 20;
            //dk_estados[1] = 43;
            //dk_estados[2] = 10;
            //dk_estados[3] = 33;
            //dk_estados[4] = 60;

            ////--------------------------

            ////Ordenar el arreglo
            //Array.Sort(dk_estados);
            //dk_estados[0] = 1;
            //dk_estados[1] = 2;
            //dk_estados[2] = 3;

            // Ordenar el arreglo de llaves por estado
            for (int i = 0; i < e.Result.Count; i++)
            {
                int temporal = 0;
                string str_temp = "";
                for (int j = i + 1; j < e.Result.Count; j++)
                {

                    if (dk_estados[i] >= dk_estados[j])
                    {
                        temporal = dk_estados[i];
                        dk_estados[i] = dk_estados[j];
                        dk_estados[j] = temporal;

                        str_temp = str_estados[i];
                        str_estados[i] = str_estados[j];
                        str_estados[j] = str_temp;

                    }
                }
            }

            // Agrega los datos ordenados a la coleccion de estados
            {
                int l = e.Result.Count - 1;
                for (int i = 0; i <= l; i++)
                    this.Estados.Add(new ItemViewModel() { LineOne = str_estados[l - i], LineTwo = "Llaves de faculty adquiridas: " + dk_estados[l - i].ToString() });
            }
            // Agregar la informacion de los 3 estados con mas y los 3 con menos llaves asignadas para desplegar en pantalla
            this.NombreDeEstado.Add(new EstadosViewModel() { LineOne = "1. " + str_estados[e.Result.Count - 1] + ": " + dk_estados[e.Result.Count - 1], LineTwo = "2. " + str_estados[e.Result.Count - 2] + ": " + dk_estados[e.Result.Count - 2], LineThree = "3. " + str_estados[e.Result.Count - 3] + ": " + dk_estados[e.Result.Count - 3], LineFour = "1. " + str_estados[0] + ": " + dk_estados[0], LineFive = "2. " + str_estados[1] + ": " + dk_estados[1], LineSix = "3. " + str_estados[2] + ": " + dk_estados[2] });


            //Agregar los 3 estados con MENOS llaves asignadas
            this.Estados_llaves_menos.Add(dk_estados[0]);
            this.Estados_llaves_menos.Add(dk_estados[1]);
            this.Estados_llaves_menos.Add(dk_estados[2]);

            //Agregar los 3 estados con MAS llaves asignadas
            this.Estados_llaves.Add(dk_estados[e.Result.Count - 1]);
            this.Estados_llaves.Add(dk_estados[e.Result.Count - 2]);
            this.Estados_llaves.Add(dk_estados[e.Result.Count - 3]);
        }

        //Metodo de llaves por estado de DreamSpark
        void cliente_keysPerStateCompleted(object sender, WebServiceItesm.keysPerStateCompletedEventArgs e)
        {
            // Vacia las colecciones
            Estados.Clear();
            Estados_llaves.Clear();
            Estados_llaves_menos.Clear();
            NombreDeEstado.Clear();

            //Inicializa las variables con los nombres de los estados y las llaves
            string[] str_estados = { "Aguascalientes", "Baja California", "Baja California Sur", "Campeche", "Chiapas", "Chihuahua", "Coahuila", "Colima", "Distrito Federal", "Durango", "Guanajuato", "Guerrero", "Hidalgo", "Jalisco", "México", "Michoacán", "Morelos", "Nayarit", "Nuevo León", "Oaxaca", "Puebla", "Querétaro", "Quintana Roo", "San Luis Potosí", "Sinaloa", "Sonora", "Tabasco", "Tamaulipas", "Tlaxcala", "Veracruz", "Yucatán", "Zacatecas" };
            int[] dk_estados = new int[32];
            for (int i = 0; i < e.Result.Count; i++)
            {
                // Guarda los valores en el arreglo de llaves por estado
                dk_estados[i] = e.Result[i];
                //this.Estados.Add(new ItemViewModel() { LineOne = str_estados[i], LineTwo = "Llaves de dreamspark adquiridas: " + dk_estados[i].ToString() });
            }

            // Ordenar el arreglo de llaves por estado
            for (int i = 0; i < e.Result.Count; i++)
            {
                int temporal = 0;
                string str_temp = "";
                for (int j = i + 1; j < e.Result.Count; j++)
                {

                    if (dk_estados[i] >= dk_estados[j])
                    {
                        temporal = dk_estados[i];
                        dk_estados[i] = dk_estados[j];
                        dk_estados[j] = temporal;

                        str_temp = str_estados[i];
                        str_estados[i] = str_estados[j];
                        str_estados[j] = str_temp;

                    }
                }
            }

            // Agrega los datos ordenados a la coleccion de estados
            {
                int l = e.Result.Count - 1;
                for (int i = 0; i <= l; i++)
                    this.Estados.Add(new ItemViewModel() { LineOne = str_estados[l - i], LineTwo = "Llaves de dreamspark adquiridas: " + dk_estados[l - i].ToString() });
            }

            // Agregar la informacion de los 3 estados con mas y los 3 con menos llaves asignadas para desplegar en pantalla
            this.NombreDeEstado.Add(new EstadosViewModel() { LineOne = "1. " + str_estados[e.Result.Count - 1] + ": " + dk_estados[e.Result.Count - 1], LineTwo = "2. " + str_estados[e.Result.Count - 2] + ": " + dk_estados[e.Result.Count - 2], LineThree = "3. " + str_estados[e.Result.Count - 3] + ": " + dk_estados[e.Result.Count - 3], LineFour = "1. " + str_estados[0] + ": " + dk_estados[0], LineFive = "2. " + str_estados[1] + ": " + dk_estados[1], LineSix = "3. " + str_estados[2] + ": " + dk_estados[2] });

            //Agregar los 3 estados con MENOS llaves asignadas
            this.Estados_llaves_menos.Add(dk_estados[0]);
            this.Estados_llaves_menos.Add(dk_estados[1]);
            this.Estados_llaves_menos.Add(dk_estados[2]);

            //MessageBox.Show("" + dk_estados[0] + " " + dk_estados[1] + " " + dk_estados[2]);
            //MessageBox.Show("" + dk_estados[e.Result.Count - 3] + " " + dk_estados[e.Result.Count - 2] + " " + dk_estados[e.Result.Count - 1]);

            //Agregar los 3 estados con MAS llaves asignadas
            this.Estados_llaves.Add(dk_estados[e.Result.Count - 1]);
            this.Estados_llaves.Add(dk_estados[e.Result.Count - 2]);
            this.Estados_llaves.Add(dk_estados[e.Result.Count - 3]);



        }

        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged(String propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (null != handler)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}