using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;

namespace Gestor_de_Contenidos
{
    public class NivelClasificacion:Nivel
    {
        private List<ItemClasificacion> items;
        public List<ItemClasificacion> Items
        {
            get { return items; }
            set { items = value; }
        }

        private List<ItemCategoria> itemsCategorias;
        public List<ItemCategoria> ItemsCategorias
        {
            get { return itemsCategorias; }
            set { itemsCategorias = value; }
        }
        public NivelClasificacion()
            : base()
        {
            items = new List<ItemClasificacion>();
            itemsCategorias = new List<ItemCategoria>();
        }

        public bool anyadirItem(ItemClasificacion item) { 
        
            // Se asegura de que no exista uno con el mismo nombre
            foreach (ItemClasificacion it in items){
                if (it.Nombre.Equals(item.Nombre))
                    return false;

            }

            items.Add(item);
            return true;
        
        
        }

        public bool anyadirItemCategoria(ItemCategoria item)
        {

            // Se asegura de que no exista uno con el mismo nombre
            foreach (ItemCategoria it in itemsCategorias)
            {
                if (it.Nombre.Equals(item.Nombre))
                    return false;

            }

            itemsCategorias.Add(item);
            return true;


        }


        public ItemClasificacion buscarItem(string nombre) {

            foreach (ItemClasificacion it in items)
            {
                if (it.Nombre.Equals(nombre))
                    return it;

            }

            return null;
        
        }

        public ItemCategoria buscarItemCategoria(string nombre)
        {

            foreach (ItemCategoria it in itemsCategorias)
            {
                if (it.Nombre.Equals(nombre))
                    return it;

            }

            return null;

        }

        

        public bool borrarItem(ItemClasificacion item) {
            
            return items.Remove(item); 
                
        }

        public bool borrarItemCategoria(ItemCategoria item)
        {
            
            // Si solo queda una categoria y hay algun inte (que tendrá esa categoria), no se deja borrar
            if(itemsCategorias.Count <=1)
                if (items.Count!=0)
                    return false;

            //Asociamos otra categoria a los items que tuvieran esta
            itemsCategorias.Remove(item);
            foreach (ItemClasificacion it in Items)
            {
                
                if (it.Categoria.Nombre.Equals(item.Nombre))
                {
                    if (itemsCategorias[0]!=null)
                        it.Categoria = itemsCategorias[0];
                    else if (itemsCategorias[0]!=null)
                            it.Categoria = itemsCategorias[1];
                         else return false;
                }
            
            }

            return true ; 

        }
        
        
        public override bool estaImplementado()
        {
            if ((items.Count == 0) || (itemsCategorias.Count == 0) || (nombre == null) || (nombre.Equals("")) || (texto == null) || (texto.Equals("")) || tieneImagenFondo() && ((fondo == null) || (fondo.Equals(""))) || (!tieneImagenFondo()&&colorFondo==0))
                return false;
            else
                return true;
        }


        internal void editarCategoria(ItemCategoria itemEditado, ItemCategoria item_no_editado)
        {
            //Cualquier item que tenga asociada a categoria, se le asociará la nueva
            foreach (ItemClasificacion it in items) {

                if (it.Categoria.Nombre == item_no_editado.Nombre)
                    it.Categoria = itemEditado;
            
            }

            //Posteriormente, se borra la categoria antigua y se inserta la nueva
            //borrarItemCategoria(item_no_editado);
            this.ItemsCategorias.Remove(item_no_editado);
            anyadirItemCategoria(itemEditado);
            
        }


        public override void escribirXML(bool esEdicion)
        {
            string ruta = obtenerRutaNivel();
            string ruta_edicion = "";
            if (esEdicion)
                ruta_edicion = obtenerRutaEdicion();
            do
            {
                try
                {
                    System.IO.Directory.CreateDirectory(ruta);
                }
                catch (Exception ex) { }
            } while (!System.IO.Directory.Exists(ruta));
            XmlTextWriter myXmlTextWriter = new XmlTextWriter(ruta + "index.xml", System.Text.Encoding.UTF8);
            myXmlTextWriter.WriteStartDocument(false);
            myXmlTextWriter.Formatting = Formatting.Indented;


            myXmlTextWriter.WriteStartElement("nivel");
            myXmlTextWriter.WriteAttributeString("tipo", "clasificacion");
            myXmlTextWriter.WriteAttributeString("nombre", Nombre);
            myXmlTextWriter.WriteAttributeString("texto", Texto);

            if (!esEdicion)
            {
                if (tieneImagenFondo())
                {
                    myXmlTextWriter.WriteAttributeString("tipo_fondo", "imagen");
                    myXmlTextWriter.WriteAttributeString("fondo", ruta + nombreArchivo(Fondo));
                    moverImagen(Fondo, ruta + nombreArchivo(Fondo));
                }
                else {

                    myXmlTextWriter.WriteAttributeString("tipo_fondo", "color");
                    myXmlTextWriter.WriteAttributeString("fondo", colorFondo.ToString());               
                }
            }
            else
            {
                if (tieneImagenFondo())
                {
                    myXmlTextWriter.WriteAttributeString("tipo_fondo", "imagen");
                    myXmlTextWriter.WriteAttributeString("fondo", ruta_edicion + nombreArchivo(Fondo));
                    moverImagen(Fondo, ruta + nombreArchivo(Fondo));
                }
                else
                {

                    myXmlTextWriter.WriteAttributeString("tipo_fondo", "color");
                    myXmlTextWriter.WriteAttributeString("fondo", colorFondo.ToString());
                }
            }

            myXmlTextWriter.WriteStartElement("clasificadores");
            foreach (ItemCategoria it in ItemsCategorias)
            {
                myXmlTextWriter.WriteStartElement("clasificador");
                myXmlTextWriter.WriteAttributeString("nombre", it.Nombre);
                if (!esEdicion)
                {
                    myXmlTextWriter.WriteAttributeString("imagen", ruta + nombreArchivo(it.Imagen));
                    moverImagen(it.Imagen, ruta + nombreArchivo(it.Imagen));
                }

                else
                {
                    
                      myXmlTextWriter.WriteAttributeString("imagen", ruta_edicion + nombreArchivo(it.Imagen));
                      moverImagen(it.Imagen, ruta + nombreArchivo(it.Imagen));
                }

                myXmlTextWriter.WriteAttributeString("texto", it.Texto);
                myXmlTextWriter.WriteEndElement();
            }
            myXmlTextWriter.WriteEndElement();

            myXmlTextWriter.WriteStartElement("items");
            foreach (ItemClasificacion it in Items)
            {
                myXmlTextWriter.WriteStartElement("item");
                myXmlTextWriter.WriteAttributeString("nombre", it.Nombre);
                if (!esEdicion)
                {
                    myXmlTextWriter.WriteAttributeString("imagen", ruta + nombreArchivo(it.Imagen));
                    moverImagen(it.Imagen, ruta + nombreArchivo(it.Imagen));
                }

                else
                {
                    myXmlTextWriter.WriteAttributeString("imagen", ruta_edicion + nombreArchivo(it.Imagen));
                    moverImagen(it.Imagen, ruta + nombreArchivo(it.Imagen));
                }
                myXmlTextWriter.WriteAttributeString("texto", it.Texto);
                myXmlTextWriter.WriteAttributeString("categoria", it.Categoria.Nombre);
                myXmlTextWriter.WriteEndElement();

            }
            myXmlTextWriter.WriteEndElement();

            myXmlTextWriter.WriteEndElement();
            myXmlTextWriter.Flush();
            myXmlTextWriter.Close();


            if (siguienteNivel != null)
                siguienteNivel.escribirXML(esEdicion);
            
        }
    }
}
