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_mc : uc_base
    {
        private NivelMJClasificacion nivel;
        private string nombre_item_seleccionado;
        private string nombre_cat_seleccionada;

        private string nombre_antiguo_nivel;
        private bool esEdicion;

        public uc_nuevo_mc()
        {
            InitializeComponent();
            nivel = new NivelMJClasificacion();
            esEdicion = false;
            pb_color.BackColor = Color.White;

            

        }

        private void btn_nueva_categoria_Click(object sender, EventArgs e)
        {
            
            if (nivel.ItemsCategorias.Count < 5)
            {
            frm_nuevo_clasificador frm = new frm_nuevo_clasificador();
            if (frm.ShowDialog() == DialogResult.OK)
            {
                ItemCategoria item = frm.getItem();
                if (nivel.anyadirItemCategoria(item))
                {
                    ListViewItem lvi = new ListViewItem(item.Nombre);
                    lv_categorias.Items.Add(lvi);
                    btn_nuevo_item.Enabled = true;
                }

                else
                    MessageBox.Show("El nombre de la categoria introducida ya existe", "Categoria Duplicada",
                                              MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            else
            {
                MessageBox.Show("Solo puede haber un máximo de 5 categorias. Elimine alguna para añadir otra.", "Máximo Permitido",
                                        MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            }
        }

        private void btn_nuevo_item_Click(object sender, EventArgs e)
        {
            frm_nuevo_item_clas frm = new frm_nuevo_item_clas(nivel);
            if (frm.ShowDialog() == DialogResult.OK)
            {
                ItemClasificacion item = frm.getItem();
                if (nivel.anyadirItem(item))
                {
                    ListViewItem lvi = new ListViewItem(item.Nombre);
                    lvi.SubItems.Add(item.Categoria.ToString());
                    lv_items.Items.Add(lvi);
                }
                else
                {
                    MessageBox.Show("El nombre del item introducido ya existe", "Item Duplicado",
                                        MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

                }

            }

        }

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

                    }
                }
            }
        }

        private void btn_eliminar_categoria_Click(object sender, EventArgs e)
        {
            DialogResult dr = MessageBox.Show("¿Está seguro que desea eliminar el clasificador? Si lo hace, los items asociados cambiarán de categoria.", "Eliminar Categoria", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
            if (dr == DialogResult.Yes)
            {
                //Borramos el item
                ItemCategoria item = nivel.buscarItemCategoria(nombre_cat_seleccionada);
                if (item != null)
                {
                    if (nivel.borrarItemCategoria(item))
                    {

                        // Refrescamos las listas con las nuevas posiciones
                        lv_items.Items.Clear();
                        foreach (ItemClasificacion it in nivel.Items)
                        {
                            ListViewItem lvi = new ListViewItem(it.Nombre);
                            lvi.SubItems.Add(it.Categoria.ToString());
                            lv_items.Items.Add(lvi);

                        }

                        lv_categorias.Items.Clear();
                        foreach (ItemCategoria it in nivel.ItemsCategorias)
                        {
                            ListViewItem lvi = new ListViewItem(it.Nombre);
                            lv_categorias.Items.Add(lvi);

                        }
                        if (nivel.ItemsCategorias.Count == 0)
                            btn_nuevo_item.Enabled = false;
                    }

                    else
                        MessageBox.Show("No se ha podido eliminar la Categoria. Es la última y está asociada a algún item", "No se puede eliminar Categoria", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

        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 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_eliminar_item.Enabled = true;
                btn_editar_item.Enabled = true;
            }

            else
            {

                btn_eliminar_item.Enabled = false;
                btn_editar_item.Enabled = false;

            }
        }

        private void lv_categorias_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (lv_categorias.SelectedItems.Count > 0)
            {
                ListViewItem it = lv_categorias.SelectedItems[0];
                nombre_cat_seleccionada = it.Text;
                btn_eliminar_categoria.Enabled = true;
                btn_editar_categoria.Enabled = true;
            }

            else
            {

                btn_eliminar_categoria.Enabled = false;
                btn_editar_categoria.Enabled = false;

            }
        }

        private void btn_editar_item_Click(object sender, EventArgs e)
        {
            frm_nuevo_item_clas frm = new frm_nuevo_item_clas(nivel);
            ItemClasificacion 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)
                {

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

                        nivel.buscarItem(nombre_item_seleccionado).Imagen = itemEditado.Imagen;
                        nivel.buscarItem(nombre_item_seleccionado).Texto = itemEditado.Texto;
                        nivel.buscarItem(nombre_item_seleccionado).Categoria = itemEditado.Categoria;
                        nivel.buscarItem(nombre_item_seleccionado).Nombre = itemEditado.Nombre;

                        // Refrescamos la lista con las novedades
                        lv_items.Items.Clear();
                        foreach (ItemClasificacion it in nivel.Items)
                        {
                            ListViewItem lvi = new ListViewItem(it.Nombre);
                            lvi.SubItems.Add(it.Categoria.Nombre);
                            lv_items.Items.Add(lvi);

                        }
                    }

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

            }
        }

        private void btn_editar_categoria_Click(object sender, EventArgs e)
        {
            frm_nuevo_clasificador frm = new frm_nuevo_clasificador();
            ItemCategoria item_no_editado = nivel.buscarItemCategoria(nombre_cat_seleccionada);

            if (item_no_editado != null)
            {

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

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

                        //Editamos la categoria y los items que tuviera asociados
                        nivel.editarCategoria(itemEditado, item_no_editado);

                        // Refrescamos las listas con las novedades
                        lv_categorias.Items.Clear();
                        foreach (ItemCategoria it in nivel.ItemsCategorias)
                        {
                            ListViewItem lvi = new ListViewItem(it.Nombre);
                            lv_categorias.Items.Add(lvi);

                        }
                        lv_items.Items.Clear();
                        foreach (ItemClasificacion it in nivel.Items)
                        {
                            ListViewItem lvi = new ListViewItem(it.Nombre);
                            lvi.SubItems.Add(it.Categoria.Nombre);
                            lv_items.Items.Add(lvi);

                        }



                    }

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

        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_pantalla_principal());
            }
        }

        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_antiguo_nivel);
                frm_principal.getInstance().cambiarPantalla(new uc_nuevo_juego());
            }

        }

        public void setNivel(NivelMJClasificacion nmjc)
        {

            nivel = nmjc;
            nombre_antiguo_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 (ItemClasificacion it in nivel.Items)
            {
                ListViewItem lvi = new ListViewItem(it.Nombre);
                lvi.SubItems.Add(it.Categoria.Nombre);
                lv_items.Items.Add(lvi);

            }

            lv_categorias.Items.Clear();
            foreach (ItemCategoria it in nivel.ItemsCategorias)
            {
                ListViewItem lvi = new ListViewItem(it.Nombre);
                lv_categorias.Items.Add(lvi);

            }

        }

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

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

            if (nivel != null && nivel.ItemsCategorias.Count > 0)
                btn_nuevo_item.Enabled = true;
            else
                btn_nuevo_item.Enabled = false;
        }

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


     
    }
}
