using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Windows.Forms;

namespace Gestor_de_Contenidos
{
    public class CargadorHistoriaXML
    
    {
        String nombre_nivel;
        String path_inicial;
        private Dictionary<TreeNode, Nivel> diccionario;
        public Dictionary<TreeNode, Nivel> Diccionario {
            get { return diccionario; }

        }
        private TreeNode nodo_raiz;
        public TreeNode Nodo_raiz
        {
            get { return nodo_raiz; }
        }

        public CargadorHistoriaXML(String nombre_nivel)
        {

            this.nombre_nivel = nombre_nivel;
            diccionario = new Dictionary<TreeNode, Nivel>();
            cargarPath();      
        
        }

        private void cargarPath()
        {
                path_inicial = frm_principal.getInstance().Path_base + "Historias\\" + nombre_nivel + "\\index.xml";
        }

        public Nivel cargar() {

            NivelHistoriaSocial n = (NivelHistoriaSocial) cargarSiguiente(path_inicial, nodo_raiz);
            return n;
        
        }

        private NivelEleccionLibre cargarEleccionLibre(TreeNode tnPadre, String path_xml)
        {
            TreeNode treeNode;
            NivelEleccionLibre nell;
            String nombre, texto, fondo, tipo_fondo;
            XmlDocument xDoc = new XmlDocument();
            xDoc.Load(path_xml+"\\index.xml");

            XmlNodeList xnl_nivel = xDoc.GetElementsByTagName("nivel");
            tipo_fondo = xnl_nivel[0].Attributes.GetNamedItem("tipo_fondo").InnerText.Trim();
            nombre = xnl_nivel[0].Attributes.GetNamedItem("nombre").InnerText.Trim();
            texto = xnl_nivel[0].Attributes.GetNamedItem("texto").InnerText.Trim();
            fondo = xnl_nivel[0].Attributes.GetNamedItem("fondo").InnerText.Trim();
            nell = new NivelEleccionLibre();
            nell.Nombre = nombre;
            if (tipo_fondo.Equals("imagen"))
                nell.Fondo = fondo;
            else
                nell.ColorFondo = int.Parse(fondo);
            nell.Texto = texto;

            treeNode = new TreeNode (nell.Nombre + " (E.L.)");
            treeNode.Expand();
            tnPadre.Nodes.Add(treeNode);
            XmlNodeList xnl_items = xDoc.GetElementsByTagName("eleccion");

            foreach (XmlElement xe_item in xnl_items)
            {

                String it_nombre = xe_item.Attributes.GetNamedItem("nombre").InnerText.Trim();
                String it_imagen = xe_item.Attributes.GetNamedItem("imagen").InnerText.Trim();
                String it_texto = xe_item.Attributes.GetNamedItem("texto").InnerText.Trim();
                String path_siguiente = xe_item.Attributes.GetNamedItem("rutaSiguiente").InnerText.Trim();

                Nivel n = cargarSiguiente(path_siguiente, treeNode);
                n.NivelAnterior = nell;

                ItemEleccionLibre it = new ItemEleccionLibre(it_nombre, it_texto, it_imagen, n);
                nell.Elecciones.Add(it);
            }

            diccionario.Add(treeNode, nell);
            return nell;
        }

        private Nivel cargarSiguiente(string path_siguiente, TreeNode treeNode)
        {
            string tipo = obtenerTipo(path_siguiente);
            switch (tipo){

                case "historia": return cargarHS();
                    break;
                case "eleccion libre": return cargarEleccionLibre(treeNode, path_siguiente);
                    break;
                case "eleccion unica": return cargarEleccionUnica(treeNode, path_siguiente);
                    break;
                case "ordenacion": return cargarOrdenacion(treeNode, path_siguiente);
                    break;
                case "explicacion": return cargarExplicacion(treeNode, path_siguiente);
                    break;
                case "clasificacion": return cargarClasificador(treeNode, path_siguiente);
                    break;
                case "colaboracion": return cargarColaboracion(treeNode, path_siguiente);
                    break;
                default: return null;
                    break;

            
            }
        }

        private string obtenerTipo(string path_siguiente)
        {
            XmlDocument xDoc = new XmlDocument();
            try
            {
                xDoc.Load(path_siguiente + "\\index.xml");
            }
            catch (Exception) { xDoc.Load(path_siguiente); }
            XmlNodeList xnl_nivel = xDoc.GetElementsByTagName("nivel");
            string tipo = xnl_nivel[0].Attributes.GetNamedItem("tipo").InnerText.Trim();
            return tipo;
        }

        private NivelExplicacion cargarExplicacion(TreeNode tnPadre, String path_xml)
        {
            NivelExplicacion nexp;
            TreeNode treeNode;
            String nombre, texto, fondo, tipo_fondo;
            XmlDocument xDoc = new XmlDocument();
            xDoc.Load(path_xml + "\\index.xml");

            XmlNodeList xnl_nivel = xDoc.GetElementsByTagName("nivel");
            tipo_fondo = xnl_nivel[0].Attributes.GetNamedItem("tipo_fondo").InnerText.Trim();
            nombre = xnl_nivel[0].Attributes.GetNamedItem("nombre").InnerText.Trim();
            texto = xnl_nivel[0].Attributes.GetNamedItem("texto").InnerText.Trim();
            fondo = xnl_nivel[0].Attributes.GetNamedItem("fondo").InnerText.Trim();
            nexp = new NivelExplicacion();
            nexp.Nombre = nombre;
            if (tipo_fondo.Equals("imagen"))
                nexp.Fondo = fondo;
            else
                nexp.ColorFondo = int.Parse(fondo);
            nexp.Texto = texto;


            treeNode = new TreeNode(nexp.Nombre + " (Exp)");
            treeNode.Expand();
            tnPadre.Nodes.Add(treeNode);
            string[] carpetas = System.IO.Directory.GetDirectories(path_xml);

            if (carpetas.Length > 0)
            {
                Nivel n = cargarSiguiente(carpetas[0], treeNode);
                nexp.SiguienteNivel = n;
                n.NivelAnterior = nexp;
            }
            diccionario.Add(treeNode, nexp);
            return nexp;
        }

        private NivelEleccionUnica cargarEleccionUnica(TreeNode tnPadre, String path_xml)
        {
            NivelEleccionUnica nelu;
            TreeNode treeNode;
            String nombre, texto, fondo, tipo_fondo;
            XmlDocument xDoc = new XmlDocument();
            xDoc.Load(path_xml+"\\index.xml");

            XmlNodeList xnl_nivel = xDoc.GetElementsByTagName("nivel");
            tipo_fondo = xnl_nivel[0].Attributes.GetNamedItem("tipo_fondo").InnerText.Trim();
            nombre = xnl_nivel[0].Attributes.GetNamedItem("nombre").InnerText.Trim();
            texto = xnl_nivel[0].Attributes.GetNamedItem("texto").InnerText.Trim();
            fondo = xnl_nivel[0].Attributes.GetNamedItem("fondo").InnerText.Trim();
            nelu = new NivelEleccionUnica();
            nelu.Nombre = nombre;
            if (tipo_fondo.Equals("imagen"))
                nelu.Fondo = fondo;
            else
                nelu.ColorFondo = int.Parse(fondo);
            nelu.Texto = texto;


            XmlNodeList xnl_items = xDoc.GetElementsByTagName("eleccion");

            foreach (XmlElement xe_item in xnl_items)
            {

                String it_nombre = xe_item.Attributes.GetNamedItem("nombre").InnerText.Trim();
                String it_imagen = xe_item.Attributes.GetNamedItem("imagen").InnerText.Trim();
                String it_texto = xe_item.Attributes.GetNamedItem("texto").InnerText.Trim();

                ItemEleccion it = new ItemEleccion(it_nombre, it_texto, it_imagen);
                nelu.Elecciones.Add(it);
            }

            XmlNodeList xnl_itemCorrecto = xDoc.GetElementsByTagName("itemCorrecto");
            String it_nombre_correcto = xnl_itemCorrecto[0].Attributes.GetNamedItem("nombre").InnerText.Trim();
            ItemEleccion itCorrecto = nelu.buscarEleccion(it_nombre_correcto);
            nelu.ItemCorrecto = itCorrecto;


            treeNode = new TreeNode(nelu.Nombre + " (E.U.)");
            treeNode.Expand();
            tnPadre.Nodes.Add(treeNode);
            string[] carpetas = System.IO.Directory.GetDirectories(path_xml);

            if (carpetas.Length > 0)
            {
                Nivel n = cargarSiguiente(carpetas[0], treeNode);
                nelu.SiguienteNivel = n;
                n.NivelAnterior = nelu;
            }
            diccionario.Add(treeNode, nelu);
            return nelu;
        }

        private NivelOrdenacion cargarOrdenacion(TreeNode tnPadre, String path_xml)
        {
            NivelOrdenacion mjOrdenacion;
            TreeNode treeNode;
            String nombre, texto, fondo,tipo_fondo;
            XmlDocument xDoc = new XmlDocument();
            xDoc.Load(path_xml + "\\index.xml");
            
            XmlNodeList xnl_nivel = xDoc.GetElementsByTagName("nivel");
            tipo_fondo = xnl_nivel[0].Attributes.GetNamedItem("tipo_fondo").InnerText.Trim();
            nombre = xnl_nivel[0].Attributes.GetNamedItem("nombre").InnerText.Trim();
            texto = xnl_nivel[0].Attributes.GetNamedItem("texto").InnerText.Trim();
            fondo = xnl_nivel[0].Attributes.GetNamedItem("fondo").InnerText.Trim();
            mjOrdenacion = new NivelOrdenacion();
            mjOrdenacion.Nombre = nombre;
            if (tipo_fondo.Equals("imagen"))
                mjOrdenacion.Fondo = fondo;
            else
                mjOrdenacion.ColorFondo = int.Parse(fondo);
            mjOrdenacion.Texto = texto;


            XmlNodeList xnl_items = xDoc.GetElementsByTagName("item");

            foreach (XmlElement xe_item in xnl_items)
            {
                
                String it_nombre = xe_item.Attributes.GetNamedItem("nombre").InnerText.Trim();
                String it_imagen = xe_item.Attributes.GetNamedItem("imagen").InnerText.Trim();
                String it_texto = xe_item.Attributes.GetNamedItem("texto").InnerText.Trim();
                String it_posicion = xe_item.Attributes.GetNamedItem("posicion").InnerText.Trim();

                ItemOrdenacion it = new ItemOrdenacion(it_nombre, it_texto, it_imagen);
                it.Posicion = int.Parse(it_posicion);

                mjOrdenacion.Items.Add(it);
            }

            treeNode = new TreeNode(mjOrdenacion.Nombre + " (Ord)");
            treeNode.Expand();
            tnPadre.Nodes.Add(treeNode);
            string[] carpetas = System.IO.Directory.GetDirectories(path_xml);

            if (carpetas.Length > 0)
            {
                Nivel n = cargarSiguiente(carpetas[0], treeNode);
                mjOrdenacion.SiguienteNivel = n;
                n.NivelAnterior = mjOrdenacion;   
            }
            diccionario.Add(treeNode, mjOrdenacion);
            return mjOrdenacion;          
        }

        private NivelColaboracion cargarColaboracion(TreeNode tnPadre, String path_xml)
        {
            NivelColaboracion nColaboracion;
            TreeNode treeNode;
            String nombre, texto, fondo, tipo_fondo;
            XmlDocument xDoc = new XmlDocument();
            xDoc.Load(path_xml + "\\index.xml");

            XmlNodeList xnl_nivel = xDoc.GetElementsByTagName("nivel");
            tipo_fondo = xnl_nivel[0].Attributes.GetNamedItem("tipo_fondo").InnerText.Trim();
            nombre = xnl_nivel[0].Attributes.GetNamedItem("nombre").InnerText.Trim();
            texto = xnl_nivel[0].Attributes.GetNamedItem("texto").InnerText.Trim();
            fondo = xnl_nivel[0].Attributes.GetNamedItem("fondo").InnerText.Trim();
            nColaboracion = new NivelColaboracion();
            nColaboracion.Nombre = nombre;
            if (tipo_fondo.Equals("imagen"))
                nColaboracion.Fondo = fondo;
            else
                nColaboracion.ColorFondo = int.Parse(fondo);
            nColaboracion.Texto = texto;


            XmlNodeList xnl_items = xDoc.GetElementsByTagName("item");

            foreach (XmlElement xe_item in xnl_items)
            {

                String it_nombre = xe_item.Attributes.GetNamedItem("nombre").InnerText.Trim();
                String it_imagen = xe_item.Attributes.GetNamedItem("imagen").InnerText.Trim();
                String it_posicion = xe_item.Attributes.GetNamedItem("posicion").InnerText.Trim();
                String it_imagenConstruida = xe_item.Attributes.GetNamedItem("imagenConstruida").InnerText.Trim();
                String frasePedir = xe_item.Attributes.GetNamedItem("frase").InnerText.Trim();

                ItemColaboracion it = new ItemColaboracion(it_nombre, it_imagen, it_imagenConstruida, frasePedir);
                it.Posicion = int.Parse(it_posicion);

                nColaboracion.Items.Add(it);
            }

            treeNode = new TreeNode(nColaboracion.Nombre + " (Col)");
            treeNode.Expand();
            tnPadre.Nodes.Add(treeNode);
            string[] carpetas = System.IO.Directory.GetDirectories(path_xml);

            if (carpetas.Length > 0)
            {
                Nivel n = cargarSiguiente(carpetas[0], treeNode);
                nColaboracion.SiguienteNivel = n;
                n.NivelAnterior = nColaboracion;
            }
            diccionario.Add(treeNode, nColaboracion);
            return nColaboracion;
        }

        private NivelClasificacion cargarClasificador(TreeNode tnPadre, String path_xml)
        {
            NivelClasificacion mjClasificacion;
            TreeNode treeNode;
            String nombre, texto, fondo,tipo_fondo;
            XmlDocument xDoc = new XmlDocument();
            xDoc.Load(path_xml + "\\index.xml");

            XmlNodeList xnl_nivel = xDoc.GetElementsByTagName("nivel");
            nombre = xnl_nivel[0].Attributes.GetNamedItem("nombre").InnerText.Trim();
            texto = xnl_nivel[0].Attributes.GetNamedItem("texto").InnerText.Trim();
            tipo_fondo = xnl_nivel[0].Attributes.GetNamedItem("tipo_fondo").InnerText.Trim();
            fondo = xnl_nivel[0].Attributes.GetNamedItem("fondo").InnerText.Trim();
            mjClasificacion = new NivelClasificacion();
            mjClasificacion.Nombre = nombre;
            if (tipo_fondo.Equals("imagen"))
                mjClasificacion.Fondo = fondo;
            else
                mjClasificacion.ColorFondo = int.Parse(fondo);
            mjClasificacion.Texto = texto;

            XmlNodeList xnl_categorias = xDoc.GetElementsByTagName("clasificador");

            foreach (XmlElement xe_item in xnl_categorias)
            {

                String it_nombre = xe_item.Attributes.GetNamedItem("nombre").InnerText.Trim();
                String it_imagen = xe_item.Attributes.GetNamedItem("imagen").InnerText.Trim();
                String it_texto = xe_item.Attributes.GetNamedItem("texto").InnerText.Trim();

                ItemCategoria it = new ItemCategoria(it_nombre, it_texto, it_imagen);

                mjClasificacion.ItemsCategorias.Add(it);
            }


            XmlNodeList xnl_items = xDoc.GetElementsByTagName("item");

            foreach (XmlElement xe_item in xnl_items)
            {

                String it_nombre = xe_item.Attributes.GetNamedItem("nombre").InnerText.Trim();
                String it_imagen = xe_item.Attributes.GetNamedItem("imagen").InnerText.Trim();
                String it_texto = xe_item.Attributes.GetNamedItem("texto").InnerText.Trim();
                String it_categoria = xe_item.Attributes.GetNamedItem("categoria").InnerText.Trim();

                ItemClasificacion it = new ItemClasificacion(it_nombre, it_texto, it_imagen);
                it.Categoria = mjClasificacion.buscarItemCategoria(it_categoria);

                mjClasificacion.Items.Add(it);
            }

            treeNode = new TreeNode(mjClasificacion.Nombre + " (Clas)");
            treeNode.Expand();
            tnPadre.Nodes.Add(treeNode);
            
            string[] carpetas = System.IO.Directory.GetDirectories(path_xml);

            if (carpetas.Length > 0)
            {
                Nivel n = cargarSiguiente(carpetas[0], treeNode);
                mjClasificacion.SiguienteNivel = n;
                n.NivelAnterior = mjClasificacion;
                       
            }
            diccionario.Add(treeNode, mjClasificacion);
            return mjClasificacion;
        }

        private NivelHistoriaSocial cargarHS()
        {
            NivelHistoriaSocial nivelHS;
            String nombre, texto;
            XmlDocument xDoc = new XmlDocument();
            xDoc.Load(path_inicial);

            XmlNodeList xnl_nivel = xDoc.GetElementsByTagName("nivel");
            nombre = xnl_nivel[0].Attributes.GetNamedItem("nombre").InnerText.Trim();
            texto = xnl_nivel[0].Attributes.GetNamedItem("texto").InnerText.Trim();
            nivelHS = new NivelHistoriaSocial();
            nivelHS.Nombre = nombre;
            nivelHS.Texto = texto;

            nodo_raiz = new TreeNode(nivelHS.Nombre + " (Historia Social)");
            nodo_raiz.Expand();
            
            string[] carpetas = System.IO.Directory.GetDirectories(frm_principal.getInstance().Path_base + "Historias\\" + nombre + "\\");

            if(carpetas.Length > 0)
            {
                Nivel n = cargarSiguiente(carpetas[0], nodo_raiz);
                nivelHS.SiguienteNivel = n;
                n.NivelAnterior = nivelHS;      
            }
            diccionario.Add(nodo_raiz, nivelHS);
            return nivelHS;
        }

    }
}
