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_hs_eleccion_libre : uc_base
    {
        NivelEleccionLibre nivel;
        private string nombre_item_seleccionado;
        private TreeNode treeNode;

        public uc_hs_eleccion_libre(NivelEleccionLibre nivel, TreeNode treeNode)
        {
            InitializeComponent();
            this.treeNode = treeNode;
            this.nivel = nivel;
            if (nivel != null)
                cargarPantalla();
            hayCambios = false;
            this.Controls.Add(frm_principal.getInstance().Tv_histora);

        }

        private void cargarPantalla()
        {
            tb_nombre.Text = nivel.Nombre;
            tb_texto.Text = nivel.Texto;
            if (nivel.tieneImagenFondo())
            {
                //Se activa la seleccion de imagen
                tb_fondo.Text = nivel.Fondo;
                pb_imagen.Visible = true;
                pb_color.Visible = false;
                pb_imagen.Image = Image.FromFile(tb_fondo.Text);
                pb_imagen.Image = pb_imagen.Image.GetThumbnailImage(pb_imagen.Width, pb_imagen.Height, null, new System.IntPtr());

                rb_fondo.Checked = true;
                rb_color.Checked = false;
                btn_buscar_imagen.Enabled = true;
            }
            else
            {
                pb_color.Visible = true;
                pb_color.BackColor = Color.FromArgb(nivel.ColorFondo);
                rb_fondo.Checked = false;
                rb_color.Checked = true;
                btn_selecciona_color.Enabled = true;
            }
            //Si existen items los añadimos
            lv_elecciones.Items.Clear();
            foreach (ItemEleccionLibre it in nivel.Elecciones)
            {
                ListViewItem lvi = new ListViewItem(it.Nombre);
                lvi.SubItems.Add(it.SiguienteNivel.getTipo());
                lvi.SubItems.Add(it.SiguienteNivel.Nombre);
                lv_elecciones.Items.Add(lvi);

            }
        }

        private void btn_eliminar_elección_Click(object sender, EventArgs e)
        {
            DialogResult dr = MessageBox.Show("¿Está seguro que desea eliminar la elección?", "Eliminar Elección", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
            if (dr == DialogResult.Yes)
            {
                //Borramos el item
                ItemEleccionLibre item = nivel.buscarEleccion(nombre_item_seleccionado);
                if (item != null)
                {
                    nivel.eliminarEleccion(item);
                    // Refrescamos las listas con las nuevas posiciones
                    lv_elecciones.Items.Clear();
                    foreach (ItemEleccionLibre it in nivel.Elecciones)
                    {
                        ListViewItem lvi = new ListViewItem(it.Nombre);
                        lvi.SubItems.Add(it.SiguienteNivel.getTipo());
                        lvi.SubItems.Add(it.SiguienteNivel.Nombre);
                        lv_elecciones.Items.Add(lvi);

                    }
                    hayCambios = true;

                    TreeNode tn = new TreeNode();
                    foreach (TreeNode t in treeNode.Nodes)
                    {
                        Nivel n;
                        frm_principal.getInstance().Dic_historia.TryGetValue(t, out n);
                        if (n.Equals(item.SiguienteNivel))
                        {
                            tn = t;
                            frm_principal.getInstance().Dic_historia.Remove(t);
                        }
                    }
                    treeNode.Nodes.Remove(tn);

                }
            }
        }

        private void btn_editar_eleccion_Click(object sender, EventArgs e)
        {
            frm_nueva_eleccion_libre frm = new frm_nueva_eleccion_libre(nivel, treeNode);
            ItemEleccionLibre item_no_editado = nivel.buscarEleccion(nombre_item_seleccionado);

            if (item_no_editado != null)
            {

                frm.setItem(item_no_editado);
                string nombre_anterior_item = nombre_item_seleccionado;
                if (frm.ShowDialog() == DialogResult.OK)
                {

                    //Miramos si el item ya existe
                    ItemEleccionLibre itemEditado = frm.getItem();
                    if (nombre_anterior_item.Equals(itemEditado.Nombre) || nivel.buscarEleccion(itemEditado.Nombre) == null)
                    {

                        //Editamos
                        nivel.buscarEleccion(nombre_anterior_item).Texto = itemEditado.Texto;
                        nivel.buscarEleccion(nombre_anterior_item).Imagen = itemEditado.Imagen;
                        nivel.buscarEleccion(nombre_anterior_item).SiguienteNivel = itemEditado.SiguienteNivel;
                        nivel.buscarEleccion(nombre_anterior_item).Nombre = itemEditado.Nombre;

                        // Refrescamos las listas con las novedades
                        lv_elecciones.Items.Clear();
                        foreach (ItemEleccionLibre it in nivel.Elecciones)
                        {
                            ListViewItem lvi = new ListViewItem(it.Nombre);
                            lvi.SubItems.Add(it.SiguienteNivel.getTipo());
                            lvi.SubItems.Add(it.SiguienteNivel.Nombre);
                            lv_elecciones.Items.Add(lvi);

                        }
                        hayCambios = true;

                    }

                    else
                        MessageBox.Show("El nombre de item ya existe", "Nombre Item ya existe", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

        private void btn_finalizar_hs_Click(object sender, EventArgs e)
        {
            finalizarHistoriaSocial();
        }

        private void lv_elecciones_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (lv_elecciones.SelectedItems.Count > 0)
            {
                ListViewItem it = lv_elecciones.SelectedItems[0];
                nombre_item_seleccionado = it.Text;

                btn_eliminar_elección.Enabled = true;
                btn_editar_eleccion.Enabled = true;
                btn_implementar.Enabled = true;
            }

            else
            {

                btn_eliminar_elección.Enabled = false;
                btn_editar_eleccion.Enabled = false;
                btn_implementar.Enabled = false;

            }
        }

        private void btn_nueva_eleccion_Click(object sender, EventArgs e)
        {
            if (nivel.Elecciones.Count < 5) // Puede haber un máximo de cinco elecciones.
            {
                frm_nueva_eleccion_libre frm = new frm_nueva_eleccion_libre(nivel, treeNode);
                if (frm.ShowDialog() == DialogResult.OK)
                {
                    ItemEleccionLibre item = frm.getItem();
                    if (nivel.anyadirEleccion(item))
                    {
                        ListViewItem lvi = new ListViewItem(item.Nombre);
                        lvi.SubItems.Add(item.SiguienteNivel.getTipo());
                        lvi.SubItems.Add(item.SiguienteNivel.Nombre);
                        lv_elecciones.Items.Add(lvi);
                        hayCambios = true;
                    }

                    else
                    {
                        MessageBox.Show("El nombre de la elección introducida o del siguiente nivel asociado ya existe", "Elección Duplicada",
                                            MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        //En caso de que ya se hubiera introducido en el arbol, se borra
                        TreeNode tnBorrar = null;
                        foreach (TreeNode tnode in treeNode.Nodes)
                        {
                            Nivel nivelAsociado;

                            frm_principal.getInstance().Dic_historia.TryGetValue(tnode, out nivelAsociado);
                            if (nivelAsociado != null)
                            {
                                if (nivelAsociado.Equals(item.SiguienteNivel))
                                {
                                    treeNode.Nodes.Remove(tnode);
                                    tnBorrar = tnode;
                                }
                            }
                        }
                        if (tnBorrar != null)
                            frm_principal.getInstance().Dic_historia.Remove(tnBorrar);

                    }
                }
            }
            else
            {
                MessageBox.Show("Solo puede haber un máximo de 5 items. Elimine alguno para añadir otro.", "Máximo Permitido",
                                        MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }

        private void uc_hs_eleccion_libre_Load(object sender, EventArgs e)
        {
            // Se crea el evento para click sobre nodo
            frm_principal.getInstance().Tv_histora.NodeMouseClick += new TreeNodeMouseClickEventHandler(Tv_histora_NodeMouseClick);
            treeNode.BackColor = Color.CornflowerBlue;

        }

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

        private void uc_hs_eleccion_libre_Leave(object sender, EventArgs e)
        {
            // Se quita el evento
            frm_principal.getInstance().Tv_histora.NodeMouseClick -= new TreeNodeMouseClickEventHandler(Tv_histora_NodeMouseClick);
            
            if (!esEliminacion)
                guardarNivel();
            if (!nivel.estaImplementado())
                treeNode.BackColor = Color.Yellow;
            else
                treeNode.BackColor = Color.White;
        }

        public override bool guardarNivel()
        {

            nivel.Nombre = tb_nombre.Text;
            nivel.Texto = tb_texto.Text;
            if (rb_color.Checked)
            {
                nivel.Fondo = "";
                nivel.ColorFondo = pb_color.BackColor.ToArgb();
            }
            else
            {
                nivel.Fondo = tb_fondo.Text;
                nivel.ColorFondo = 0;
            }

            if (!nivel.estaImplementado())
                return false;
            else
            {
                string tipo = "";
                if (nivel.GetType().Equals(new NivelExplicacion().GetType()))
                    tipo = " (Exp)";
                if (nivel.GetType().Equals(new NivelClasificacion().GetType()))
                    tipo = " (Clas)";
                if (nivel.GetType().Equals(new NivelOrdenacion().GetType()))
                    tipo = " (Ord)";
                if (nivel.GetType().Equals(new NivelColaboracion().GetType()))
                    tipo = " (Col)";
                if (nivel.GetType().Equals(new NivelEleccionLibre().GetType()))
                    tipo = " (E.L.)";
                if (nivel.GetType().Equals(new NivelEleccionUnica().GetType()))
                    tipo = " (E.U.)";

                nivel.NivelAnterior.SiguienteNivel = nivel;
                frm_principal.getInstance().Dic_historia.Remove(treeNode);
                treeNode.Text = tb_nombre.Text + tipo;
                frm_principal.getInstance().Dic_historia.Add(treeNode, nivel);
                hayCambios = false;
                return true;

            }
        }

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

        private void tb_nombre_TextChanged(object sender, EventArgs e)
        {
            hayCambios = true;
            if (!tb_nombre.Text.Equals(""))
            {
                string tipo = " (E.L.)";
                frm_principal.getInstance().Dic_historia.Remove(treeNode);
                treeNode.Text = tb_nombre.Text + tipo;
                frm_principal.getInstance().Dic_historia.Add(treeNode, nivel);
            }
        }

        private void btn_eliminar_nivel_Click(object sender, EventArgs e)
        {
            esEliminacion = true;
            eliminarNivel();
            esEliminacion = false;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (colorDialog1.ShowDialog() == DialogResult.OK)
            {
                pb_color.BackColor = colorDialog1.Color;
            }
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            if (tb_fondo.Text.Equals(""))
                pb_imagen.Visible = false;
            else
            {
                pb_imagen.Visible = true;
                pb_imagen.Image = Image.FromFile(tb_fondo.Text);
                pb_imagen.Image = pb_imagen.Image.GetThumbnailImage(pb_imagen.Width, pb_imagen.Height, null, new System.IntPtr());
            }
            hayCambios = true;
        }

        public override Nivel getNivel()
        {

            return nivel;
        }

        public override TreeNode getTreeNode()
        {
            return treeNode;
        }

        private void btn_buscar_imagen_Click(object sender, EventArgs e)
        {
            if (colorDialog1.ShowDialog() == DialogResult.OK)
            {
                pb_color.BackColor = colorDialog1.Color;
            }
        }

        private void btn_implementar_Click(object sender, EventArgs e)
        {

            TreeNode node = null ;
            ItemEleccionLibre item = nivel.buscarEleccion(nombre_item_seleccionado);
            
            if (item != null)
            {
                Nivel siguiente_nivel = item.SiguienteNivel;
                foreach (TreeNode t in frm_principal.getInstance().Dic_historia.Keys)
                {
                    Nivel n = null;
                    frm_principal.getInstance().Dic_historia.TryGetValue(t, out n);
                    if (siguiente_nivel.Equals(n))
                        node = t;
                }


                if (siguiente_nivel.GetType().Equals(new NivelHistoriaSocial().GetType()))
                    frm_principal.getInstance().cambiarPantalla(new uc_nueva_hs((NivelHistoriaSocial)siguiente_nivel, node));
                if (siguiente_nivel.GetType().Equals(new NivelExplicacion().GetType()))
                    frm_principal.getInstance().cambiarPantalla(new uc_hs_explicacion((NivelExplicacion)siguiente_nivel, node));
                if (siguiente_nivel.GetType().Equals(new NivelEleccionUnica().GetType()))
                    frm_principal.getInstance().cambiarPantalla(new uc_hs_eleccion_unica((NivelEleccionUnica)siguiente_nivel, node));
                if (siguiente_nivel.GetType().Equals(new NivelOrdenacion().GetType()))
                    frm_principal.getInstance().cambiarPantalla(new uc_hs_ordenacion((NivelOrdenacion)siguiente_nivel, node));
                if (siguiente_nivel.GetType().Equals(new NivelClasificacion().GetType()))
                    frm_principal.getInstance().cambiarPantalla(new uc_hs_clasificacion((NivelClasificacion)siguiente_nivel, node));
                if (siguiente_nivel.GetType().Equals(new NivelColaboracion().GetType()))
                    frm_principal.getInstance().cambiarPantalla(new uc_hs_colaboracion((NivelColaboracion)siguiente_nivel, node));
                if (siguiente_nivel.GetType().Equals(new NivelEleccionLibre().GetType()))
                    frm_principal.getInstance().cambiarPantalla(new uc_hs_eleccion_libre((NivelEleccionLibre)siguiente_nivel, node));

            }

        }

        private void lv_elecciones_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            frm_nueva_eleccion_libre frm = new frm_nueva_eleccion_libre(nivel, treeNode);
            ItemEleccionLibre item_no_editado = nivel.buscarEleccion(nombre_item_seleccionado);

            if (item_no_editado != null)
            {

                frm.setItem(item_no_editado);
                string nombre_anterior_item = nombre_item_seleccionado;
                if (frm.ShowDialog() == DialogResult.OK)
                {

                    //Miramos si el item ya existe
                    ItemEleccionLibre itemEditado = frm.getItem();
                    if (nombre_anterior_item.Equals(itemEditado.Nombre) || nivel.buscarEleccion(itemEditado.Nombre) == null)
                    {

                        //Editamos
                        nivel.buscarEleccion(nombre_anterior_item).Texto = itemEditado.Texto;
                        nivel.buscarEleccion(nombre_anterior_item).Imagen = itemEditado.Imagen;
                        nivel.buscarEleccion(nombre_anterior_item).SiguienteNivel = itemEditado.SiguienteNivel;
                        nivel.buscarEleccion(nombre_anterior_item).Nombre = itemEditado.Nombre;

                        // Refrescamos las listas con las novedades
                        lv_elecciones.Items.Clear();
                        foreach (ItemEleccionLibre it in nivel.Elecciones)
                        {
                            ListViewItem lvi = new ListViewItem(it.Nombre);
                            lvi.SubItems.Add(it.SiguienteNivel.getTipo());
                            lvi.SubItems.Add(it.SiguienteNivel.Nombre);
                            lv_elecciones.Items.Add(lvi);

                        }
                        hayCambios = true;

                    }

                    else
                        MessageBox.Show("El nombre de item ya existe", "Nombre Item ya existe", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

        /*Esto evita que se pongan caracteres no deseados en el nombre del nivel*/
        private void tb_nombre_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;
            }
        }
    }
}
