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_nuevo_mo : uc_base
    {

        private NivelMJOrdenacion nivel;
        private frm_nuevo_item_ord frm_nuevo_item;
        private string nombre_item_seleccionado;
        private ListViewColumnSorter lvwColumnSorter;
        
        // Para edicion
        private bool esEdicion;
        private string nombre_antigo_nivel;

        public uc_nuevo_mo()
        {
            InitializeComponent();
            nivel = new NivelMJOrdenacion();
            esEdicion = false;
            lvwColumnSorter = new ListViewColumnSorter();
            lv_items.ListViewItemSorter = lvwColumnSorter;
            pb_color.BackColor = Color.White;

        }

        private void uc_nuevo_mo_Load(object sender, EventArgs e)
        {
            if (nivel.tieneImagenFondo())
            {
                rb_fondo.Checked = true;
                btn_buscar_imagen.Enabled = true;
                pb_imagen.Visible = true;

                rb_color.Checked = false;
                btn_selecciona_color.Enabled = false;
                pb_color.Visible = false;
            }
            else
            {
                rb_color.Checked = true;
                btn_selecciona_color.Enabled = true;
                pb_color.Visible = true;

                rb_fondo.Checked = false;
                btn_buscar_imagen.Enabled = false;
                pb_imagen.Visible = false;

            }
        }

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

        private void btn_guardar_Click(object sender, EventArgs e)
        {
            if (!esEdicion)
                guardarNuevoNivel();
            else
                editarNivel();


        }

        private void btn_nuevo_item_Click(object sender, EventArgs e)
        {
            if (nivel.Items.Count < 5)
            {
            frm_nuevo_item = new frm_nuevo_item_ord();
            if (frm_nuevo_item.ShowDialog() == DialogResult.OK)          
            {
                ItemOrdenacion 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();
                }

                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_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_arriba_Click(object sender, EventArgs e)
        {
            subirItem(nivel.buscarItem(nombre_item_seleccionado));
            ordenarItems();
            
        }

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

        private void ordenarItems() {

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

        }

        private void subirItem(ItemOrdenacion 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;

           
            }

        }

        private void bajarItem(ItemOrdenacion 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;


            }
        
        
        }

        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
                ItemOrdenacion item = nivel.buscarItem(nombre_item_seleccionado);
                if (item != null)
                {
                    nivel.borrarItem(item);
                    // Refrescamos la lista con las nuevas posiciones
                    lv_items.Items.Clear();
                    foreach (ItemOrdenacion 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_ord frm = new frm_nuevo_item_ord();
            ItemOrdenacion 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)
                {
                    ItemOrdenacion 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 (ItemOrdenacion it in nivel.Items)
                    {
                        ListViewItem lvi = new ListViewItem(it.Nombre);
                        lvi.SubItems.Add(it.Posicion.ToString());
                        lv_items.Items.Add(lvi);

                    }

                }
            }
        }

        public void setNivel(NivelMJOrdenacion nmjo) {

            nivel = nmjo;
            nombre_antigo_nivel = nivel.Nombre;
            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;
            }
            esEdicion = true;

            // Refrescamos la lista con las nuevas posiciones
            lv_items.Items.Clear();
            foreach (ItemOrdenacion it in nivel.Items)
            {
                ListViewItem lvi = new ListViewItem(it.Nombre);
                lvi.SubItems.Add(it.Posicion.ToString());
                lv_items.Items.Add(lvi);

            }
            
        }

        private void guardarNuevoNivel() 
        {

            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())
                //error, no se guarda el nivel
                MessageBox.Show("Faltan datos por introducir", "Nivel Incompleto");
            else
            // Se guarda el nivel y se cierra
            {
                EscritorXML escritor = new EscritorXML(nivel);
                escritor.escribir();
                frm_principal.getInstance().cambiarPantalla(new uc_nuevo_juego());
            }
        }

        private void editarNivel()
        {

            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())
                //error, no se guarda el nivel
                MessageBox.Show("Faltan datos por introducir", "Nivel Incompleto");
            else
            // Se guarda el nivel y se cierra
            {
               
                // Comprobar si el nombre ha cambiado (por lo que cambia la ruta)
                EscritorXML escritor = new EscritorXML(nivel);
                escritor.editar(nombre_antigo_nivel);
                frm_principal.getInstance().cambiarPantalla(new uc_nuevo_juego());
            }
        
        }

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

        private void btn_buscar_imagen_Click_1(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                tb_fondo.Text = openFileDialog1.FileName;
            }
        }

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

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

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

     
    }
}
