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_colaboracion : uc_base
    {
        private NivelColaboracion nivel;
        private string nombre_item_seleccionado;
        private ListViewColumnSorter lvwColumnSorter;
        private TreeNode treeNode;

        public uc_hs_colaboracion(NivelColaboracion nivel, TreeNode treeNode)
        {
            InitializeComponent();
            this.treeNode = treeNode;
            lvwColumnSorter = new ListViewColumnSorter();
            lv_items.ListViewItemSorter = lvwColumnSorter;
            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;
            }
            lv_items.Items.Clear();
            foreach (ItemColaboracion it in nivel.Items)
            {
                ListViewItem lvi = new ListViewItem(it.Nombre);
                lvi.SubItems.Add(it.Posicion.ToString());
                lv_items.Items.Add(lvi);

            }
            ordenarItems();

        }


        private void btn_editar_item_Click(object sender, EventArgs e)
        {
            frm_nuevo_item_colab frm = new frm_nuevo_item_colab();
            ItemColaboracion item_no_editado = nivel.buscarItem(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)
                {
                    ItemColaboracion itemEditado = frm.getItem();
                    nivel.buscarItem(nombre_item_seleccionado).Imagen = itemEditado.Imagen;
                    nivel.buscarItem(nombre_item_seleccionado).Texto = itemEditado.Texto;
                    nivel.buscarItem(nombre_item_seleccionado).Nombre = itemEditado.Nombre;
                    // Refrescamos la lista con las novedades
                    lv_items.Items.Clear();
                    foreach (ItemColaboracion it in nivel.Items)
                    {
                        ListViewItem lvi = new ListViewItem(it.Nombre);
                        lvi.SubItems.Add(it.Posicion.ToString());
                        lv_items.Items.Add(lvi);

                    }
                    hayCambios = true;

                }
            }
        }

        private void btn_eliminar_item_Click(object sender, EventArgs e)
        {
            DialogResult dr = MessageBox.Show("¿Está seguro que desea eliminar el item", "Eliminar Item", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
            if (dr == DialogResult.Yes)
            {
                //Borramos el item
                ItemColaboracion item = nivel.buscarItem(nombre_item_seleccionado);
                if (item != null)
                {
                    nivel.borrarItem(item);
                    // Refrescamos la lista con las nuevas posiciones
                    lv_items.Items.Clear();
                    foreach (ItemColaboracion it in nivel.Items)
                    {
                        ListViewItem lvi = new ListViewItem(it.Nombre);
                        lvi.SubItems.Add(it.Posicion.ToString());
                        lv_items.Items.Add(lvi);

                    }
                    hayCambios = true;
                }


                ordenarItems();
            }
        }

        private void btn_abajo_Click(object sender, EventArgs e)
        {
            bajarItem(nivel.buscarItem(nombre_item_seleccionado));
            ordenarItems();
        }

        private void btn_arriba_Click(object sender, EventArgs e)
        {
            subirItem(nivel.buscarItem(nombre_item_seleccionado));
            ordenarItems();
        }

        private void btn_siguiente_nivel_Click(object sender, EventArgs e)
        {

            if (nivel.SiguienteNivel == null)
            {

                if (guardarNivel())
                {

                    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(treeNode);
                        frm_principal.getInstance().Dic_historia.Add(treeNode, 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);
                            treeNode.Nodes.Add(tn);
                            treeNode.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);
                            treeNode.Nodes.Add(tn);
                            treeNode.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);
                            treeNode.Nodes.Add(tn);
                            treeNode.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);
                            treeNode.Nodes.Add(tn);
                            treeNode.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);
                            treeNode.Nodes.Add(tn);
                            treeNode.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);
                            treeNode.Nodes.Add(tn);
                            treeNode.Expand();
                            frm_principal.getInstance().cambiarPantalla(new uc_hs_eleccion_libre((NivelEleccionLibre)nivel_nuevo, tn));
                        }

                    }

                }
                else
                {
                    MessageBox.Show("Rellena todos los campos", "Incompleto", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            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 = treeNode.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(treeNode);
                            frm_principal.getInstance().Dic_historia.Add(treeNode, 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);
                                treeNode.Nodes.Add(tn);
                                treeNode.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);
                                treeNode.Nodes.Add(tn);
                                treeNode.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);
                                treeNode.Nodes.Add(tn);
                                treeNode.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);
                                treeNode.Nodes.Add(tn);
                                treeNode.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);
                                treeNode.Nodes.Add(tn);
                                treeNode.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);

                        }
                    }

                }
            }
        }

       


        private void ordenarItems()
        {

            lvwColumnSorter.Order = SortOrder.Ascending;
            lvwColumnSorter.SortColumn = 1;
            this.lv_items.Sort();

        }

        private void subirItem(ItemColaboracion item)
        {

            if (item.Posicion > 1)
            {

                ListViewItem lvitem = lv_items.Items[item.Posicion - 1];
                ListViewItem lvitemAnt = lv_items.Items[item.Posicion - 2];

                lvitem.SubItems[1].Text = (item.Posicion - 1).ToString();
                lvitemAnt.SubItems[1].Text = (item.Posicion).ToString();

                //Obtenemos el item anterior y cambiamos las posiciones
                nivel.buscarItem(item.Posicion - 1).Posicion = item.Posicion;
                item.Posicion -= 1;
                hayCambios = true;


            }




        }

        private void bajarItem(ItemColaboracion item)
        {

            if (item.Posicion < nivel.Items.Count)
            {

                ListViewItem lvitem = lv_items.Items[item.Posicion - 1];
                ListViewItem lvitemAnt = lv_items.Items[item.Posicion];

                lvitem.SubItems[1].Text = (item.Posicion + 1).ToString();
                lvitemAnt.SubItems[1].Text = (item.Posicion).ToString();

                //Obtenemos el item anterior y cambiamos las posiciones
                nivel.buscarItem(item.Posicion + 1).Posicion = item.Posicion;
                item.Posicion += 1;
                hayCambios = true;


            }

        }

        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 uc_hs_colaboracion_Load(object sender, EventArgs e)
        {
            //Evento de click sobre un 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_colaboracion_Leave(object sender, EventArgs e)
        {
            // Quitamos 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;
        }

        private void lv_items_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (lv_items.SelectedItems.Count > 0)
            {
                ListViewItem it = lv_items.SelectedItems[0];
                nombre_item_seleccionado = it.Text;
                btn_abajo.Enabled = true;
                btn_arriba.Enabled = true;
                btn_eliminar_item.Enabled = true;
                btn_editar_item.Enabled = true;
            }

            else
            {

                btn_abajo.Enabled = false;
                btn_arriba.Enabled = false;
                btn_eliminar_item.Enabled = false;
                btn_editar_item.Enabled = false;

            }
        }

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

        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 = " (Col)";
                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 btn_buscar_imagen_Click_1(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                tb_fondo.Text = openFileDialog1.FileName;
            }
        }

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

        private void tb_fondo_TextChanged_1(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;
        }

        private void rb_fondo_CheckedChanged(object sender, EventArgs e)
        {
            if (rb_fondo.Checked)
            {
                pb_imagen.Visible = true;
                btn_buscar_imagen.Enabled = true;
                pb_color.Visible = false;
                btn_selecciona_color.Enabled = false;
            }
            else
            {

                pb_imagen.Visible = false;
                btn_buscar_imagen.Enabled = false;
                pb_color.Visible = true;
                btn_selecciona_color.Enabled = true;
            }
        }

        public override Nivel getNivel()
        {

            return nivel;
        }

        public override TreeNode getTreeNode()
        {
            return treeNode;
        }

        private void btn_nuevo_item_Click_1(object sender, EventArgs e)
        {
            if (nivel.Items.Count < 5) // No puede haber más de cinco items
            {
                frm_nuevo_item_colab frm_nuevo_item = new frm_nuevo_item_colab();
                if (frm_nuevo_item.ShowDialog() == DialogResult.OK)
                {
                    ItemColaboracion item = frm_nuevo_item.getItem();
                    item.Posicion = nivel.Items.Count + 1;
                    //Si el item no existe, se añade
                    if (nivel.anyadirItem(item))
                    {
                        ListViewItem lvi = new ListViewItem(item.Nombre);
                        lvi.SubItems.Add(item.Posicion.ToString());
                        lv_items.Items.Add(lvi);
                        ordenarItems();
                        hayCambios = true;
                    }

                    else
                    {
                        MessageBox.Show("El nombre del item introducido ya existe", "Item Duplicado",
                                            MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

                    }
                }
            }
            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 lv_items_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            frm_nuevo_item_colab frm = new frm_nuevo_item_colab();
            ItemColaboracion item_no_editado = nivel.buscarItem(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)
                {
                    ItemColaboracion itemEditado = frm.getItem();
                    nivel.buscarItem(nombre_item_seleccionado).Imagen = itemEditado.Imagen;
                    nivel.buscarItem(nombre_item_seleccionado).Texto = itemEditado.Texto;
                    nivel.buscarItem(nombre_item_seleccionado).Nombre = itemEditado.Nombre;
                    // Refrescamos la lista con las novedades
                    lv_items.Items.Clear();
                    foreach (ItemColaboracion it in nivel.Items)
                    {
                        ListViewItem lvi = new ListViewItem(it.Nombre);
                        lvi.SubItems.Add(it.Posicion.ToString());
                        lv_items.Items.Add(lvi);

                    }
                    hayCambios = true;

                }
            }
        }

        /*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;
            }
        }

    }
}
