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

namespace Gestor_de_Contenidos
{
    public class EscritorXML
    {
        private Nivel nivel;
        public Nivel Nivel {

            get { return nivel; }
            set { nivel = value; }
        
        }
        String path_original;
        String path_nuevo;
        String path_auxiliar;

        private bool esEdicion;

        public EscritorXML(Nivel nivel) {

            this.nivel = nivel;
            esEdicion = false;
        }


        public bool editar(String nombre_anterior)
        {
            esEdicion = true;
            if (nivel.GetType().Equals(new NivelMJOrdenacion().GetType()))
                return editarMJOrdenacion(nombre_anterior);
            else if (nivel.GetType().Equals(new NivelMJClasificacion().GetType()))
                return editarMJClasificacion(nombre_anterior);
            else return false;

        }

        public bool escribir(){

            if (nivel.GetType().Equals(new NivelMJOrdenacion().GetType()))
            {
                path_original = frm_principal.getInstance().Path_base + "Ordenadores\\" + nivel.Nombre;
                return escribirMJOrdenacion();
            }
            else if (nivel.GetType().Equals(new NivelMJClasificacion().GetType()))
            {
                path_original = frm_principal.getInstance().Path_base + "Clasificadores\\" + nivel.Nombre;
                return escribirMJClasificacion();
            }
            else return false;

        }

        private bool escribirMJClasificacion()
        {
            String p;
            if (!esEdicion)
                p = path_original;
            else
                p = path_auxiliar;
            
            NivelMJClasificacion nivelClasificacion = (NivelMJClasificacion)nivel;
            System.IO.Directory.CreateDirectory(p);
            XmlTextWriter myXmlTextWriter = new XmlTextWriter(p + "\\index.xml", System.Text.Encoding.UTF8);
            myXmlTextWriter.WriteStartDocument(false);
            myXmlTextWriter.Formatting = Formatting.Indented;


            myXmlTextWriter.WriteStartElement("nivel");
                myXmlTextWriter.WriteAttributeString("nombre", nivelClasificacion.Nombre);
                myXmlTextWriter.WriteAttributeString("texto", nivelClasificacion.Texto);
                
            if (!esEdicion)
                {
                    if (nivelClasificacion.tieneImagenFondo())
                    {
                        myXmlTextWriter.WriteAttributeString("tipo_fondo", "imagen");
                        myXmlTextWriter.WriteAttributeString("fondo", path_original + "\\" + nombreArchivo(nivelClasificacion.Fondo));
                        moverImagen(nivelClasificacion.Fondo, path_original + "\\" + nombreArchivo(nivelClasificacion.Fondo));
                    }
                    else {
                        myXmlTextWriter.WriteAttributeString("tipo_fondo", "color");
                        myXmlTextWriter.WriteAttributeString("fondo", nivelClasificacion.ColorFondo.ToString());                   
                    }
                }
                else
                {
                    if (nivelClasificacion.tieneImagenFondo())
                    {
                        myXmlTextWriter.WriteAttributeString("tipo_fondo", "imagen");
                        myXmlTextWriter.WriteAttributeString("fondo", path_nuevo + "\\" + nombreArchivo(nivelClasificacion.Fondo));
                        moverImagen(nivelClasificacion.Fondo, path_auxiliar + "\\" + nombreArchivo(nivelClasificacion.Fondo));
                    }
                    else {
                        myXmlTextWriter.WriteAttributeString("tipo_fondo", "color");
                        myXmlTextWriter.WriteAttributeString("fondo", nivelClasificacion.ColorFondo.ToString()); 
                    }
                }

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

                    else
                    {
                        myXmlTextWriter.WriteAttributeString("imagen", path_nuevo + "\\" + nombreArchivo(it.Imagen));
                        moverImagen(it.Imagen, path_auxiliar + "\\" + nombreArchivo(it.Imagen));
                    }
                    myXmlTextWriter.WriteAttributeString("texto", it.Texto);
                    myXmlTextWriter.WriteEndElement();
                }
                myXmlTextWriter.WriteEndElement();

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

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

                }
                myXmlTextWriter.WriteEndElement();

            myXmlTextWriter.WriteEndElement();
            myXmlTextWriter.Flush();
            myXmlTextWriter.Close();
            
            return true;
        }

        private bool escribirMJOrdenacion()
        {
            String p;
            if (!esEdicion)
                p = path_original;
            else
                p = path_auxiliar;
            
            NivelMJOrdenacion nivelClasificacion = (NivelMJOrdenacion)nivel;
            System.IO.Directory.CreateDirectory(p);

            XmlTextWriter myXmlTextWriter = new XmlTextWriter(p + "\\index.xml", System.Text.Encoding.UTF8);
            myXmlTextWriter.WriteStartDocument(false);
            myXmlTextWriter.Formatting = Formatting.Indented;


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

            if (!esEdicion)
            {
                if (nivelClasificacion.tieneImagenFondo())
                {
                    myXmlTextWriter.WriteAttributeString("tipo_fondo", "imagen");
                    myXmlTextWriter.WriteAttributeString("fondo", path_original + "\\" + nombreArchivo(nivelClasificacion.Fondo));
                    moverImagen(nivelClasificacion.Fondo, path_original + "\\" + nombreArchivo(nivelClasificacion.Fondo));
                }
                else
                {
                    myXmlTextWriter.WriteAttributeString("tipo_fondo", "color");
                    myXmlTextWriter.WriteAttributeString("fondo", nivelClasificacion.ColorFondo.ToString());
                }
            }
            else
            {
                if (nivelClasificacion.tieneImagenFondo())
                {
                    myXmlTextWriter.WriteAttributeString("tipo_fondo", "imagen");
                    myXmlTextWriter.WriteAttributeString("fondo", path_nuevo + "\\" + nombreArchivo(nivelClasificacion.Fondo));
                    moverImagen(nivelClasificacion.Fondo, path_auxiliar + "\\" + nombreArchivo(nivelClasificacion.Fondo));
                }
                else
                {
                    myXmlTextWriter.WriteAttributeString("tipo_fondo", "color");
                    myXmlTextWriter.WriteAttributeString("fondo", nivelClasificacion.ColorFondo.ToString());
                }
            }
            myXmlTextWriter.WriteStartElement("items");
            foreach (ItemOrdenacion it in nivelClasificacion.Items)
            {
                myXmlTextWriter.WriteStartElement("item");
                myXmlTextWriter.WriteAttributeString("nombre", it.Nombre);
                if (!esEdicion)
                {
                    myXmlTextWriter.WriteAttributeString("imagen", path_original + "\\" + nombreArchivo(it.Imagen));
                    moverImagen(it.Imagen, path_original + "\\" + nombreArchivo(it.Imagen));
                }

                else
                {
                    myXmlTextWriter.WriteAttributeString("imagen", path_nuevo + "\\" + nombreArchivo(it.Imagen));
                    moverImagen(it.Imagen, path_auxiliar + "\\" + nombreArchivo(it.Imagen));
                }

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

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

            return true;
        }

        private void moverImagen(string fuente, string destino) {

            try
            {
                Image originalImage = Image.FromFile(fuente);
                if (originalImage.Height > 480 || originalImage.Width > 640)
                {
                    Bitmap bitmap = ResizeImage(fuente, 640, 480);
                    bitmap.Save(destino);
                    bitmap.Dispose();
                }
                else
                {
                    originalImage.Dispose();
                    System.IO.File.Copy(fuente, destino, true);

                }
                originalImage.Dispose();
            }
            catch (Exception) { }
        }

        //Image Resize Helper Method
        public static Bitmap ResizeImage(String filename, int maxWidth, int maxHeight)
        {
            using (Image originalImage = Image.FromFile(filename))
            {
                //Caluate new Size
                int newWidth = originalImage.Width;
                int newHeight = originalImage.Height;
                double aspectRatio = (double)originalImage.Width / (double)originalImage.Height;
                if (aspectRatio <= 1 && originalImage.Width > maxWidth)
                {
                    newWidth = maxWidth;
                    newHeight = (int)Math.Round(newWidth / aspectRatio);
                }
                else if (aspectRatio > 1 && originalImage.Height > maxHeight)
                {
                    newHeight = maxHeight;
                    newWidth = (int)Math.Round(newHeight * aspectRatio);
                }
                Bitmap newImage = new Bitmap(newWidth, newHeight);
                using (Graphics g = Graphics.FromImage(newImage))
                {
                    //--Quality Settings Adjust to fit your application
                    g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear;
                    g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                    g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
                    g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
                    g.DrawImage(originalImage, 0, 0, newImage.Width, newImage.Height);
                    return newImage;
                }
            }
        }

        private string nombreArchivo(string p)
        {

            string[] res = p.Split('\\');
            string nombre = res[res.Length - 1];
            return nombre;
        }

        private bool editarMJClasificacion(String nombre_anterior)
        {
            NivelMJClasificacion nivelClasificacion = (NivelMJClasificacion)nivel;
            path_nuevo = frm_principal.getInstance().Path_base + "Clasificadores\\" + nivelClasificacion.Nombre;
            path_auxiliar = frm_principal.getInstance().Path_base + "Clasificadores\\auxiliar";
            path_original = frm_principal.getInstance().Path_base + "Clasificadores\\" + nombre_anterior;
            escribirMJClasificacion();
            do{
            try
            {
                System.IO.Directory.Delete(path_original, true);                
            }
            catch (Exception ex) { }
            }while(System.IO.Directory.Exists(path_original));
            System.IO.Directory.Move(path_auxiliar, path_nuevo);
            return true;
        }

        private bool editarMJOrdenacion(String nombre_anterior)
        {
            NivelMJOrdenacion nivelClasificacion = (NivelMJOrdenacion)nivel;
            path_nuevo = frm_principal.getInstance().Path_base + "Ordenadores\\" + nivelClasificacion.Nombre;
            path_auxiliar = frm_principal.getInstance().Path_base + "Ordenadores\\auxiliar";
            path_original = frm_principal.getInstance().Path_base + "Ordenadores\\" + nombre_anterior;
            escribirMJOrdenacion();
            do
            {
                try
                {
                    System.IO.Directory.Delete(path_original, true);
                }
                catch (Exception ex) { }
            } while (System.IO.Directory.Exists(path_original));
            System.IO.Directory.Move(path_auxiliar, path_nuevo);
            return true;
        }

    }
}
