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;

namespace Gestor_de_Contenidos
{
    public partial class uc_nueva_hs : uc_base
    {
        private NivelHistoriaSocial nivel;
        private TreeNode tn_raiz;
        private Dictionary<TreeNode, Nivel> diccionario;
        TreeView tv;

        public uc_nueva_hs()
        {
            InitializeComponent();
            nivel = new NivelHistoriaSocial();
            tv = frm_principal.getInstance().Tv_histora;
            if (!frm_principal.getInstance().EsEdicionHistoria)
            {
                tn_raiz = new TreeNode("Historia Social");
                tv.Nodes.Add(tn_raiz);

                diccionario = frm_principal.getInstance().Dic_historia;
                diccionario.Add(tn_raiz, nivel);
            }
            else 
            
            {
                Nivel hs=null;
                tn_raiz = tv.Nodes[0];
                try
                {
                    foreach (Nivel n in frm_principal.getInstance().Dic_historia.Values)
                    {
                        if (n.GetType().Equals(new NivelHistoriaSocial().GetType()))
                            hs = n;
                    }
                }
                catch (Exception) { }
                nivel = (NivelHistoriaSocial)hs;

                tb_descripcion.Text = nivel.Texto;
                tb_titulo.Text = nivel.Nombre;
                hayCambios = false;
            }

            tv.Location = new Point(30, 30);
            tv.Size = new Size(230,614);
            this.Controls.Add(tv);
            hayCambios = false;

        }

        public uc_nueva_hs(NivelHistoriaSocial nivel_hs, TreeNode treeNode)
        {
            InitializeComponent();
            this.nivel = nivel_hs;
            tv = frm_principal.getInstance().Tv_histora;
            tn_raiz = treeNode;
            tv.Location = new Point(30, 30);
            tv.Size = new Size(230, 614);
            this.Controls.Add(tv);

            if(nivel!=null){
                tb_descripcion.Text = nivel.Texto;
                tb_titulo.Text = nivel.Nombre;
                hayCambios = false;
            }
        }

       

        private void btn_siguiente_nivel_Click(object sender, EventArgs e)
        {
            if (tb_titulo.Text != null && !existeOtraHistoria(tb_titulo.Text))
            {
                if (!tb_descripcion.Text.Equals("") && !tb_titulo.Text.Equals(""))
                {

                    nivel.Texto = tb_descripcion.Text;
                    nivel.Nombre = tb_titulo.Text;
                    tv.Nodes[0].Text = tb_titulo.Text;

                    if (nivel.SiguienteNivel == null)
                    {

                        form_nuevo_nivel_hs frm = new form_nuevo_nivel_hs();
                        if (frm.ShowDialog() == DialogResult.OK)
                        {
                            Nivel nivel_nuevo = frm.getNivel();
                            //Actualizamos el nivel siguiente y anterior.
                            nivel_nuevo.NivelAnterior = nivel;
                            nivel.SiguienteNivel = nivel_nuevo;

                            //Actualizamos datos de este nivel en diccionario
                            frm_principal.getInstance().Dic_historia.Remove(tn_raiz);
                            frm_principal.getInstance().Dic_historia.Add(tn_raiz, nivel);

                            // Segun del tipo que sea el nivel, abrimos la ventana
                            if (nivel_nuevo.GetType().Equals(new NivelExplicacion().GetType()))
                            {
                                TreeNode tn = new TreeNode(nivel_nuevo.Nombre + " (Exp)");
                                frm_principal.getInstance().Dic_historia.Add(tn, (NivelExplicacion)nivel_nuevo);
                                tn_raiz.Nodes.Add(tn);
                                tn_raiz.Expand();
                                frm_principal.getInstance().cambiarPantalla(new uc_hs_explicacion((NivelExplicacion)nivel_nuevo, tn));

                            }
                            else if (nivel_nuevo.GetType().Equals(new NivelEleccionUnica().GetType()))
                            {
                                TreeNode tn = new TreeNode(nivel_nuevo.Nombre + " (E.U.)");
                                frm_principal.getInstance().Dic_historia.Add(tn, (NivelEleccionUnica)nivel_nuevo);
                                tn_raiz.Nodes.Add(tn);
                                tn_raiz.Expand();
                                frm_principal.getInstance().cambiarPantalla(new uc_hs_eleccion_unica((NivelEleccionUnica)nivel_nuevo, tn));
                            }
                            else if (nivel_nuevo.GetType().Equals(new NivelOrdenacion().GetType()))
                            {
                                TreeNode tn = new TreeNode(nivel_nuevo.Nombre + " (Ord)");
                                frm_principal.getInstance().Dic_historia.Add(tn, (NivelOrdenacion)nivel_nuevo);
                                tn_raiz.Nodes.Add(tn);
                                tn_raiz.Expand();
                                frm_principal.getInstance().cambiarPantalla(new uc_hs_ordenacion((NivelOrdenacion)nivel_nuevo, tn));
                            }
                            else if (nivel_nuevo.GetType().Equals(new NivelClasificacion().GetType()))
                            {
                                TreeNode tn = new TreeNode(nivel_nuevo.Nombre + " (Clas)");
                                frm_principal.getInstance().Dic_historia.Add(tn, (NivelClasificacion)nivel_nuevo);
                                tn_raiz.Nodes.Add(tn);
                                tn_raiz.Expand();
                                frm_principal.getInstance().cambiarPantalla(new uc_hs_clasificacion((NivelClasificacion)nivel_nuevo, tn));
                            }
                            else if (nivel_nuevo.GetType().Equals(new NivelColaboracion().GetType()))
                            {
                                TreeNode tn = new TreeNode(nivel_nuevo.Nombre + " (Col)");
                                frm_principal.getInstance().Dic_historia.Add(tn, (NivelColaboracion)nivel_nuevo);
                                tn_raiz.Nodes.Add(tn);
                                tn_raiz.Expand();
                                frm_principal.getInstance().cambiarPantalla(new uc_hs_colaboracion((NivelColaboracion)nivel_nuevo, tn));
                            }
                            else if (nivel_nuevo.GetType().Equals(new NivelEleccionLibre().GetType()))
                            {
                                TreeNode tn = new TreeNode(nivel_nuevo.Nombre + " (E.L.)");
                                frm_principal.getInstance().Dic_historia.Add(tn, (NivelEleccionLibre)nivel_nuevo);
                                tn_raiz.Nodes.Add(tn);
                                tn_raiz.Expand();
                                frm_principal.getInstance().cambiarPantalla(new uc_hs_eleccion_libre((NivelEleccionLibre)nivel_nuevo, tn));
                            }



                        }
                    }
                    else
                    {
                        if (DialogResult.Yes == MessageBox.Show("Ya existe un siguiente nivel. ¿Desea añadir un nivel entre el actual y el siguiente?", "Siguiente nivel ya existente", MessageBoxButtons.YesNo, MessageBoxIcon.Question))
                        {

                            TreeNode tnHijos = tn_raiz.FirstNode;
                            tnHijos.Expand();
                            tnHijos.ExpandAll();
                            form_nuevo_nivel_hs frm = new form_nuevo_nivel_hs();
                            if (frm.ShowDialog() == DialogResult.OK)
                            {
                                Nivel nivel_nuevo = frm.getNivel();

                                if (!nivel_nuevo.GetType().Equals(new NivelEleccionLibre().GetType()))
                                {

                                    nivel_nuevo.SiguienteNivel = nivel.SiguienteNivel;
                                    nivel.SiguienteNivel.NivelAnterior = nivel_nuevo;
                                    nivel.SiguienteNivel = nivel_nuevo;
                                    nivel_nuevo.NivelAnterior = nivel;

                                    //Actualizamos datos de este nivel en diccionario
                                    frm_principal.getInstance().Dic_historia.Remove(tn_raiz);
                                    frm_principal.getInstance().Dic_historia.Add(tn_raiz, nivel);

                                    frm_principal.getInstance().Tv_histora.Nodes.Remove(tnHijos);


                                    // Segun del tipo que sea el nivel, abrimos la ventana
                                    if (nivel_nuevo.GetType().Equals(new NivelExplicacion().GetType()))
                                    {
                                        TreeNode tn = new TreeNode(nivel_nuevo.Nombre + " (Exp)");
                                        tn.Nodes.Add(tnHijos);
                                        tn.Expand();
                                        frm_principal.getInstance().Dic_historia.Add(tn, (NivelExplicacion)nivel_nuevo);
                                        tn_raiz.Nodes.Add(tn);
                                        tn_raiz.Expand();
                                        frm_principal.getInstance().cambiarPantalla(new uc_hs_explicacion((NivelExplicacion)nivel_nuevo, tn));

                                    }

                                    else if (nivel_nuevo.GetType().Equals(new NivelEleccionUnica().GetType()))
                                    {
                                        TreeNode tn = new TreeNode(nivel_nuevo.Nombre + " (E.U.)");
                                        tn.Nodes.Add(tnHijos);
                                        tn.Expand();
                                        frm_principal.getInstance().Dic_historia.Add(tn, (NivelEleccionUnica)nivel_nuevo);
                                        tn_raiz.Nodes.Add(tn);
                                        tn_raiz.Expand();

                                        frm_principal.getInstance().cambiarPantalla(new uc_hs_eleccion_unica((NivelEleccionUnica)nivel_nuevo, tn));
                                    }
                                    else if (nivel_nuevo.GetType().Equals(new NivelOrdenacion().GetType()))
                                    {
                                        TreeNode tn = new TreeNode(nivel_nuevo.Nombre + " (Ord)");
                                        tn.Nodes.Add(tnHijos);
                                        tn.Expand();
                                        frm_principal.getInstance().Dic_historia.Add(tn, (NivelOrdenacion)nivel_nuevo);
                                        tn_raiz.Nodes.Add(tn);
                                        tn_raiz.Expand();

                                        frm_principal.getInstance().cambiarPantalla(new uc_hs_ordenacion((NivelOrdenacion)nivel_nuevo, tn));
                                    }
                                    else if (nivel_nuevo.GetType().Equals(new NivelClasificacion().GetType()))
                                    {
                                        TreeNode tn = new TreeNode(nivel_nuevo.Nombre + " (Clas)");
                                        tn.Nodes.Add(tnHijos);
                                        tn.Expand();
                                        frm_principal.getInstance().Dic_historia.Add(tn, (NivelClasificacion)nivel_nuevo);
                                        tn_raiz.Nodes.Add(tn);
                                        tn_raiz.Expand();
                                        frm_principal.getInstance().cambiarPantalla(new uc_hs_clasificacion((NivelClasificacion)nivel_nuevo, tn));
                                    }
                                    else if (nivel_nuevo.GetType().Equals(new NivelColaboracion().GetType()))
                                    {
                                        TreeNode tn = new TreeNode(nivel_nuevo.Nombre + " (Col)");
                                        tn.Nodes.Add(tnHijos);
                                        tn.Expand();
                                        frm_principal.getInstance().Dic_historia.Add(tn, (NivelColaboracion)nivel_nuevo);
                                        tn_raiz.Nodes.Add(tn);
                                        tn_raiz.Expand();
                                        frm_principal.getInstance().cambiarPantalla(new uc_hs_colaboracion((NivelColaboracion)nivel_nuevo, tn));
                                    }

                                }
                                else
                                {
                                    MessageBox.Show("No se puede insertar un nivel de Elección Libre entre dos niveles.", "Elección de nivel no válida", MessageBoxButtons.OK, MessageBoxIcon.Error);

                                }
                            }

                        }
                    }

                }
                else
                {
                    MessageBox.Show("Rellena los dos campos", "Incompleto", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

        private void uc_nueva_hs_Load(object sender, EventArgs e)
        {
            frm_principal.getInstance().Tv_histora.NodeMouseClick += new TreeNodeMouseClickEventHandler(Tv_histora_NodeMouseClick);
            tn_raiz.BackColor = Color.CornflowerBlue;
        }

        void Tv_histora_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            TreeNode node = e.Node;
            seleccionarNodoTreeView(node, hayCambios, (TreeView)sender);
        }


        public override bool guardarNivel()
        {

            nivel.Nombre = tb_titulo.Text;
            nivel.Texto = tb_descripcion.Text;

            if (!nivel.estaImplementado())
                return false;
            else
            {
                frm_principal.getInstance().Dic_historia.Remove(tn_raiz);
                tn_raiz.Text = tb_titulo.Text + (" HS");
                frm_principal.getInstance().Dic_historia.Add(tn_raiz, nivel);
                hayCambios = false;
                return true;

            }
        }

        private bool existeOtraHistoria(string nombre_actual)
        {
            // No se puede poner a una historia este nombre, ya que se usa para otros fines.
            if (nombre_actual.Equals("auxiliar")) {
                
                MessageBox.Show("Por motivos internos a la aplicación, no está permitido el nombre 'auxiliar'. Utilice otro nombre.", "Nombre de Historia no válido",MessageBoxButtons.OK,MessageBoxIcon.Hand);
                return true;
            
            }


            string[] carpetas = System.IO.Directory.GetDirectories(frm_principal.getInstance().Path_base + "Historias");
            
            //Si estamos en edicion no comprobamos esto
            if (frm_principal.getInstance().EsEdicionHistoria)
            {
                if (nombre_actual.Equals(frm_principal.getInstance().Nombre_histora_antes_edicion))
                    return false;
                else {

                    foreach (string juego in carpetas)
                    {
                        string[] aux = juego.Split('\\');
                        string nombre = aux[aux.Length - 1];

                        if (nombre.Equals(nombre_actual))
                        {
                            MessageBox.Show("Existe una historia con el mismo nombre. Por favor, cambie el nombre", "Historia Existente", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                            return true;
                        }
                    }
                    return false;
                
                }
            }
            else
            {
                // Comprobamos que no existan historias con el mismo nombre
                foreach (string juego in carpetas)
                {
                    string[] aux = juego.Split('\\');
                    string nombre = aux[aux.Length - 1];

                    if (nombre.Equals(nombre_actual))
                    {
                        MessageBox.Show("Existe una historia con el mismo nombre. Por favor, cambie el nombre", "Historia Existente", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                        return true;
                    }
                }
                return false;
            }
        }

        private void uc_nueva_hs_Leave(object sender, EventArgs e)
        {
            frm_principal.getInstance().Tv_histora.NodeMouseClick -= new TreeNodeMouseClickEventHandler(Tv_histora_NodeMouseClick);
            tn_raiz.BackColor = Color.White;
        }

        private void tb_descripcion_TextChanged(object sender, EventArgs e)
        {
            hayCambios = true;
        }

        private void tb_titulo_TextChanged(object sender, EventArgs e)
        {
            hayCambios = true;
            if (!tb_titulo.Text.Equals(""))
            {
                string tipo = " (H.S.)";
                frm_principal.getInstance().Dic_historia.Remove(tn_raiz);
                tn_raiz.Text = tb_titulo.Text + tipo;
                frm_principal.getInstance().Dic_historia.Add(tn_raiz, nivel);
            }
        }

        private void btn_finalizar_hs_Click(object sender, EventArgs e)
        {
            if(tb_titulo.Text != null && !existeOtraHistoria(tb_titulo.Text)){
                finalizarHistoriaSocial();    
            }
        }

        public override Nivel getNivel()
        {
            return nivel;
        }

        public override TreeNode getTreeNode()
        {
            return tn_raiz;
        }

        /*Esto evita que se pongan caracteres no deseados en el nombre del nivel*/
        private void tb_titulo_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsLetter(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsControl(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsSeparator(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsNumber(e.KeyChar))
            {
                e.Handled = false;

            }
            else
            {
                e.Handled = true;
            }
        }
        


    }
}
