using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;

namespace Gestor_de_Contenidos
{
    public partial class uc_ver_resultados : uc_base
    {
        List<Paciente> pacientes;
        List<RegistroMJO> mjos;
        List<RegistroMJC> mjcs;
        List<RegistroHS> historias;

        string nombre_registro_seleccionado, hora_seleccionado, fecha_seleccionado, tipo_seleccionado;

        Paciente paciente_seleccionado;

        public uc_ver_resultados():base()
        {
            InitializeComponent();
            pacientes = new List<Paciente>();
            mjos = new List<RegistroMJO>();
            mjcs = new List<RegistroMJC>();
            historias = new List<RegistroHS>();
        }

        private void btn_volver_Click(object sender, EventArgs e)
        {
            frm_principal.getInstance().cambiarPantalla(new uc_pantalla_principal());
        }

        private void uc_ver_resultados_Load(object sender, EventArgs e)
        {
            cargarPacientes();
            cargarPacientesCombo();
        }

        private void cargarPacientes()
        {
            pacientes = new List<Paciente>();
            Paciente p = new Paciente("Paciente", "General", DateTime.Today);
            p.Id = 0;
            pacientes.Add(p);
            try
            {
                string[] carpetas = System.IO.Directory.GetDirectories(frm_principal.getInstance().Path_base + "\\Pacientes\\");
                foreach (string s in carpetas)
                {
                    string[] aux = s.Split('\\');
                    string id = aux[aux.Length - 1];
                    if (!id.Equals("0"))
                        pacientes.Add(cargarPacienteXML(id));
                }
            }
            catch (Exception) { }
        }

        public Paciente cargarPacienteXML(string id)
        {
            Paciente p;
            String nombre, apellidos, fecha;
            XmlDocument xDoc = new XmlDocument();
            xDoc.Load(frm_principal.getInstance().Path_base + "\\Pacientes\\" + id + "\\index.xml");

            XmlNodeList xnl_nivel = xDoc.GetElementsByTagName("paciente");
            nombre = xnl_nivel[0].Attributes.GetNamedItem("nombre").InnerText.Trim();
            apellidos = xnl_nivel[0].Attributes.GetNamedItem("apellidos").InnerText.Trim();
            fecha = xnl_nivel[0].Attributes.GetNamedItem("fecha").InnerText.Trim();
            DateTime dt_fecha = DateTime.Parse(fecha);

            p = new Paciente(nombre, apellidos, dt_fecha);
            p.Id = int.Parse(id);

            return p;



        }

        private void cargarPacientesCombo()
        {

            foreach (Paciente p in pacientes) {

                cb_pacientes.Items.Add(p);
            
            }
                

            
        }

        private void cb_pacientes_SelectedIndexChanged(object sender, EventArgs e)
        {
            ComboBox cb = (ComboBox)sender;
            paciente_seleccionado = (Paciente)cb.SelectedItem;
            lvi_registros.Items.Clear();
            

            if (cb_hs.Checked == true)
                cargarHSPaciente(paciente_seleccionado);

            if (cb_mjc.Checked == true)
                cargarMJC(paciente_seleccionado);

            if (cb_mjo.Checked == true)
                cargarMJO(paciente_seleccionado);
        }

        private void cargarMJO(Paciente p)
        {
            mjos.Clear();
            try
            {
                string[] archivos = System.IO.Directory.GetFiles(frm_principal.getInstance().Path_base + "\\Pacientes\\" + p.Id + "\\");
                foreach (string s in archivos)
                {
                    string[] aux = s.Split('\\');
                    string id = aux[aux.Length - 1];
                    if (id.Contains("Juego_AutGame.NivelMJOrdenacion"))
                    {
                        string[] aux2 = id.Split('-');
                        string hora = aux2[2];
                        string fecha = aux2[1];
                        RegistroMJO r = cargarMJOXML(s);
                        r.fecha_juego = fecha;
                        r.hora_juego = hora;
                        mjos.Add(r);
                        
                    }
                }
            }
            catch (Exception) { }

            foreach (RegistroMJO reg in mjos)
            {
                
                ListViewItem lvi = new ListViewItem(reg.ToString());
                lvi.SubItems.Add("Ordenacion");
                lvi.SubItems.Add(reg.fecha_juego);
                lvi.SubItems.Add(reg.hora_juego);

                lvi_registros.Items.Add(lvi);

            }


        }

        private RegistroMJO cargarMJOXML(string ruta)
        {
            String nombre_nivel;
            XmlDocument xDoc = new XmlDocument();
            xDoc.Load(ruta);

            XmlNodeList xnl_nivel = xDoc.GetElementsByTagName("inicio");
            nombre_nivel = xnl_nivel[0].Attributes.GetNamedItem("nombre").InnerText.Trim();

            RegistroMJO registro = new RegistroMJO(nombre_nivel);

            XmlNodeList xnl_registros = xDoc.GetElementsByTagName("registro");

            foreach (XmlElement xe in xnl_registros) {

                String tipo, tiempo, mano,item;
                tipo = xe.Attributes.GetNamedItem("tipo").InnerText.Trim();
                tiempo = xe.Attributes.GetNamedItem("tiempo").InnerText.Trim();
                mano = xe.Attributes.GetNamedItem("mano").InnerText.Trim();
                item = xe.Attributes.GetNamedItem("itemJuego").InnerText.Trim();
                RegistroItemOrden r = new RegistroItemOrden(tipo, int.Parse(tiempo), mano, item);
                registro.anyadirRegistro(r);
            }


            return registro;
        }

        private void cargarMJC(Paciente p)
        {
            mjcs.Clear();
            try
            {
                string[] archivos = System.IO.Directory.GetFiles(frm_principal.getInstance().Path_base + "\\Pacientes\\" + p.Id + "\\");
                foreach (string s in archivos)
                {
                    string[] aux = s.Split('\\');
                    string id = aux[aux.Length - 1];
                    if (id.Contains("Juego_AutGame.NivelMJClasificacion"))
                    {
                        string[] aux2 = id.Split('-');
                        string hora = aux2[2];
                        string fecha = aux2[1];
                        RegistroMJC r = cargarMJCXML(s);
                        r.fecha_juego = fecha;
                        r.hora_juego = hora;
                        mjcs.Add(r);

                    }
                }
            }
            catch (Exception) { }

            foreach (RegistroMJC reg in mjcs)
            {

                ListViewItem lvi = new ListViewItem(reg.ToString());
                lvi.SubItems.Add("Clasificacion");
                lvi.SubItems.Add(reg.fecha_juego);
                lvi.SubItems.Add(reg.hora_juego);

                lvi_registros.Items.Add(lvi);

            }
        }

        private RegistroMJC cargarMJCXML(string ruta)
        {
            String nombre_nivel;
            XmlDocument xDoc = new XmlDocument();
            xDoc.Load(ruta);

            XmlNodeList xnl_nivel = xDoc.GetElementsByTagName("inicio");
            nombre_nivel = xnl_nivel[0].Attributes.GetNamedItem("nombre").InnerText.Trim();

            RegistroMJC registro = new RegistroMJC(nombre_nivel);

            XmlNodeList xnl_registros = xDoc.GetElementsByTagName("registro");

            foreach (XmlElement xe in xnl_registros)
            {

                String tipo, tiempo, mano, item, categoria;
                tipo = xe.Attributes.GetNamedItem("tipo").InnerText.Trim();
                tiempo = xe.Attributes.GetNamedItem("tiempo").InnerText.Trim();
                mano = xe.Attributes.GetNamedItem("mano").InnerText.Trim();
                item = xe.Attributes.GetNamedItem("itemJuego").InnerText.Trim();
                categoria = xe.Attributes.GetNamedItem("categoriaSeleccionada").InnerText.Trim();
                RegistroItemClasificacion r = new RegistroItemClasificacion(tipo, int.Parse(tiempo), mano, item,categoria);
                registro.anyadirRegistro(r);
            }


            return registro;
        }

        private void cargarHSPaciente(Paciente p)
        {
            historias.Clear();
            try
            {
                string[] archivos = System.IO.Directory.GetFiles(frm_principal.getInstance().Path_base + "\\Pacientes\\" + p.Id + "\\");
                foreach (string s in archivos)
                {
                    string[] aux = s.Split('\\');
                    string id = aux[aux.Length - 1];
                    if (id.Contains("Juego_AutGame.NivelHistoriaSocial"))
                    {
                        string[] aux2 = id.Split('-');
                        string hora = aux2[2];
                        string fecha = aux2[1];
                        string nombre = aux2[aux2.Length - 1];
                        RegistroHS r = cargarHistoria(s);
                        r.fecha_juego = fecha;
                        r.hora_juego = hora;
                        historias.Add(r);

                    }
                }
            }
            catch (Exception) { }

            foreach (RegistroHS reg in historias)
            {

                ListViewItem lvi = new ListViewItem(reg.ToString());
                lvi.SubItems.Add("Historia Social");
                lvi.SubItems.Add(reg.fecha_juego);
                lvi.SubItems.Add(reg.hora_juego);

                lvi_registros.Items.Add(lvi);

            }
        }

        private RegistroHS cargarHistoria(string ruta)
        {
            String nombre_nivel;
            XmlDocument xDoc = new XmlDocument();
            xDoc.Load(ruta);

            XmlNodeList xnl_nivel = xDoc.GetElementsByTagName("inicio");
            nombre_nivel = xnl_nivel[0].Attributes.GetNamedItem("nombre").InnerText.Trim();

            RegistroHS registro = new RegistroHS(nombre_nivel);

            XmlNodeList xnl_registros = xDoc.GetElementsByTagName("nivel");

            //Todos los niveles dentro de la hs
            foreach (XmlElement xe in xnl_registros)
            {

                String tipo_nivel, nombre;
                tipo_nivel = xe.Attributes.GetNamedItem("tipo_nivel").InnerText.Trim();
                nombre = xe.Attributes.GetNamedItem("nombre").InnerText.Trim();
                RegistroNivelHS r = new RegistroNivelHS(tipo_nivel, nombre);
                
                //Todos los registros dentro de cada nivel de la hs
                XmlNodeList xnl_reg_nivel = xe.GetElementsByTagName("registro");
                foreach (XmlElement xreg in xnl_reg_nivel) {
                    string tipo, tiempo, mano;

                    if (tipo_nivel.Equals("Explicación")) {

                        tipo = xreg.Attributes.GetNamedItem("tipo").InnerText.Trim();
                        tiempo = xreg.Attributes.GetNamedItem("tiempo").InnerText.Trim();
                        mano = xreg.Attributes.GetNamedItem("mano").InnerText.Trim();

                        RegistroItemExplicacion rItem = new RegistroItemExplicacion(tipo, int.Parse(tiempo), mano);
                        r.registros.Add(rItem);
                    
                    }

                    if (tipo_nivel.Equals("Clasificación"))
                    {
                        tipo=  xreg.Attributes.GetNamedItem("tipo").InnerText.Trim();
                        tiempo=  xreg.Attributes.GetNamedItem("tiempo").InnerText.Trim();
                        mano=  xreg.Attributes.GetNamedItem("mano").InnerText.Trim();
                        string itemJuego=  xreg.Attributes.GetNamedItem("itemJuego").InnerText.Trim();
                        string categoriaSeleccionada=  xreg.Attributes.GetNamedItem("categoriaSeleccionada").InnerText.Trim();

                        RegistroItemClasificacion rItem = new RegistroItemClasificacion(tipo, int.Parse(tiempo), mano, itemJuego, categoriaSeleccionada);
                        r.registros.Add(rItem);
                    }

                    if (tipo_nivel.Equals("Ordenación"))
                    {
                        tipo = xreg.Attributes.GetNamedItem("tipo").InnerText.Trim();
                        tiempo = xreg.Attributes.GetNamedItem("tiempo").InnerText.Trim();
                        mano = xreg.Attributes.GetNamedItem("mano").InnerText.Trim();
                        string itemJuego = xreg.Attributes.GetNamedItem("itemJuego").InnerText.Trim();

                        RegistroItemOrden rItem = new RegistroItemOrden(tipo, int.Parse(tiempo), mano, itemJuego);
                        r.registros.Add(rItem);

                    }

                    if (tipo_nivel.Equals("Elección Única"))
                    {
                        tipo = xreg.Attributes.GetNamedItem("tipo").InnerText.Trim();
                        tiempo = xreg.Attributes.GetNamedItem("tiempo").InnerText.Trim();
                        mano = xreg.Attributes.GetNamedItem("mano").InnerText.Trim();
                        string eleccionSeleccionada = xreg.Attributes.GetNamedItem("eleccionSeleccionada").InnerText.Trim();

                        RegistroItemEleccionUnica rItem = new RegistroItemEleccionUnica(tipo, int.Parse(tiempo), mano, eleccionSeleccionada);
                        r.registros.Add(rItem);

                    }

                    if (tipo_nivel.Equals("Elección Libre"))
                    {
                        tipo = xreg.Attributes.GetNamedItem("tipo").InnerText.Trim();
                        tiempo = xreg.Attributes.GetNamedItem("tiempo").InnerText.Trim();
                        mano = xreg.Attributes.GetNamedItem("mano").InnerText.Trim();
                        string eleccionSeleccionada = xreg.Attributes.GetNamedItem("eleccionSeleccionada").InnerText.Trim();
                        string siguienteNivel = xreg.Attributes.GetNamedItem("siguienteNivel").InnerText.Trim();

                        RegistroItemEleccionLibre rItem = new RegistroItemEleccionLibre(tipo, int.Parse(tiempo), mano, eleccionSeleccionada, siguienteNivel);
                        r.registros.Add(rItem);

                    }

                    if (tipo_nivel.Equals("Colaboración"))
                    {
                        tipo = xreg.Attributes.GetNamedItem("tipo").InnerText.Trim();
                        tiempo = xreg.Attributes.GetNamedItem("tiempo").InnerText.Trim();
                        mano = xreg.Attributes.GetNamedItem("mano").InnerText.Trim();
                        string itemJuego = xreg.Attributes.GetNamedItem("itemJuego").InnerText.Trim();

                        RegistroItemColaboracion rItem = new RegistroItemColaboracion(tipo, int.Parse(tiempo), mano, itemJuego);
                        r.registros.Add(rItem);

                    }


                
                
                }
                //Aqui falta ahora añadr los registros de cada tipo de nivel dentro de la hs

                registro.anyadirRegistro(r);
            }


            return registro;
        }

        private void cb_mjo_CheckedChanged(object sender, EventArgs e)
        {
            lvi_registros.Items.Clear();

            if (cb_hs.Checked == true)
                cargarHSPaciente(paciente_seleccionado);

            if (cb_mjc.Checked == true)
                cargarMJC(paciente_seleccionado);

            if (cb_mjo.Checked == true)
                cargarMJO(paciente_seleccionado);
        }

        private void cb_mjc_CheckedChanged(object sender, EventArgs e)
        {
            lvi_registros.Items.Clear();

            if (cb_hs.Checked == true)
                cargarHSPaciente(paciente_seleccionado);

            if (cb_mjc.Checked == true)
                cargarMJC(paciente_seleccionado);

            if (cb_mjo.Checked == true)
                cargarMJO(paciente_seleccionado);
        }

        private void cb_hs_CheckedChanged(object sender, EventArgs e)
        {
            lvi_registros.Items.Clear();

            if (cb_hs.Checked == true)
                cargarHSPaciente(paciente_seleccionado);

            if (cb_mjc.Checked == true)
                cargarMJC(paciente_seleccionado);

            if (cb_mjo.Checked == true)
                cargarMJO(paciente_seleccionado);
        }

        private void btn_ver_resultados_Click(object sender, EventArgs e)
        {
            try
            {

                if (tipo_seleccionado.Equals("Clasificacion"))
                {
                    RegistroMJC registro_analizar=null;
                    foreach (RegistroMJC reg in mjcs) 
                    {

                        if (reg.nombre_nivel.Equals(nombre_registro_seleccionado) && reg.hora_juego.Equals(hora_seleccionado)
                            && reg.fecha_juego.Equals(fecha_seleccionado))

                            registro_analizar = reg;
                    }

                    if (registro_analizar != null)
                    {
                        frm_visualizar_mjc frm = new frm_visualizar_mjc(registro_analizar);
                        frm.ShowDialog();
                    }
                
                }

                if (tipo_seleccionado.Equals("Ordenacion"))
                {
                    RegistroMJO registro_analizar = null;
                    foreach (RegistroMJO reg in mjos)
                    {

                        if (reg.nombre_nivel.Equals(nombre_registro_seleccionado) && reg.hora_juego.Equals(hora_seleccionado)
                            && reg.fecha_juego.Equals(fecha_seleccionado))

                            registro_analizar = reg;
                    }

                    if (registro_analizar != null)
                    {
                        frm_visualizar_mjo frm = new frm_visualizar_mjo(registro_analizar);
                        frm.ShowDialog();
                    }

                }

                if (tipo_seleccionado.Equals("Historia Social"))
                {
                    RegistroHS registro_analizar = null;
                    foreach (RegistroHS reg in historias)
                    {

                        if (reg.nombre_nivel.Equals(nombre_registro_seleccionado) && reg.hora_juego.Equals(hora_seleccionado)
                            && reg.fecha_juego.Equals(fecha_seleccionado))

                            registro_analizar = reg;
                    }

                    if (registro_analizar != null)
                    {
                        frm_visualizar_hs frm = new frm_visualizar_hs(registro_analizar);
                        frm.ShowDialog();
                    }

                }

            }
            catch (Exception ex) { }
        }

        private void lvi_registros_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (lvi_registros.SelectedItems.Count > 0)
            {
                ListViewItem item = lvi_registros.SelectedItems[0];
                nombre_registro_seleccionado = item.Text;
                tipo_seleccionado = lvi_registros.SelectedItems[0].SubItems[1].Text;
                fecha_seleccionado = lvi_registros.SelectedItems[0].SubItems[2].Text;
                hora_seleccionado = lvi_registros.SelectedItems[0].SubItems[3].Text;
                btn_ver_resultados.Enabled = true;
            }

            else
            {

                btn_ver_resultados.Enabled = false;

            }
        }

        private void lvi_registros_DoubleClick(object sender, EventArgs e)
        {
            try
            {

                if (tipo_seleccionado.Equals("Clasificacion"))
                {
                    RegistroMJC registro_analizar = null;
                    foreach (RegistroMJC reg in mjcs)
                    {

                        if (reg.nombre_nivel.Equals(nombre_registro_seleccionado) && reg.hora_juego.Equals(hora_seleccionado)
                            && reg.fecha_juego.Equals(fecha_seleccionado))

                            registro_analizar = reg;
                    }

                    if (registro_analizar != null)
                    {
                        frm_visualizar_mjc frm = new frm_visualizar_mjc(registro_analizar);
                        frm.ShowDialog();
                    }

                }

                if (tipo_seleccionado.Equals("Ordenacion"))
                {
                    RegistroMJO registro_analizar = null;
                    foreach (RegistroMJO reg in mjos)
                    {

                        if (reg.nombre_nivel.Equals(nombre_registro_seleccionado) && reg.hora_juego.Equals(hora_seleccionado)
                            && reg.fecha_juego.Equals(fecha_seleccionado))

                            registro_analizar = reg;
                    }

                    if (registro_analizar != null)
                    {
                        frm_visualizar_mjo frm = new frm_visualizar_mjo(registro_analizar);
                        frm.ShowDialog();
                    }

                }

                if (tipo_seleccionado.Equals("Historia Social"))
                {
                    RegistroHS registro_analizar = null;
                    foreach (RegistroHS reg in historias)
                    {

                        if (reg.nombre_nivel.Equals(nombre_registro_seleccionado) && reg.hora_juego.Equals(hora_seleccionado)
                            && reg.fecha_juego.Equals(fecha_seleccionado))

                            registro_analizar = reg;
                    }

                    if (registro_analizar != null)
                    {
                        frm_visualizar_hs frm = new frm_visualizar_hs(registro_analizar);
                        frm.ShowDialog();
                    }

                }

            }
            catch (Exception ex) { }
        }
    }
}
