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

namespace Gestor_de_Contenidos
{
    /*
     Clase padre nivel. Todos los niveles heredan de ella.
     */
    public class Nivel
    {
        protected string fondo;
        public string Fondo {
            get { return fondo; }
            set { fondo = value; }
        }
        protected string nombre;
        public string Nombre
        {
            get { return nombre; }
            set { nombre = value; }
        }
        protected string texto;
        public string Texto
        {
            get { return texto; }
            set { texto = value; }
        }

        protected Nivel siguienteNivel;
        public Nivel SiguienteNivel {
            get { return siguienteNivel; }
            set { siguienteNivel = value; }
        }

        protected int colorFondo;
        public int ColorFondo {
            get { return colorFondo; }
            set { colorFondo = value; }
        }

        protected Nivel nivelAnterior;
        public Nivel NivelAnterior {
            get { return nivelAnterior; }
            set { nivelAnterior = value; }
        }

        public Nivel() {

            colorFondo = 0;
            
        }

        public virtual Boolean estaImplementado() {

            return false;
        
        }

        public override string ToString()
        {
            return nombre;
        }

        public virtual void escribirXML(bool esEdicion) { 
        
        
        }

        /*Obtiene la ruta que tendrá en el sistema de ficheros un cierto nivel */
        public string obtenerRutaNivel()
        {

            Stack<Nivel> pila = new Stack<Nivel>();
            string ruta = frm_principal.getInstance().Path_base + "Historias\\";
            pila.Push(this);
            do
            {
                if (((Nivel)pila.Peek()).NivelAnterior != null)
                    pila.Push(((Nivel)pila.Peek()).NivelAnterior);

            } while (((Nivel)pila.Peek()).NivelAnterior != null);

            Nivel n = null;
            do
            {
                n = null;
                if (pila.Count > 0)
                {
                    n = pila.Pop();
                    if (n != null)
                        ruta = ruta + n.Nombre + "\\";
                }
            } while (n != null);

            return ruta;

        }

        public string obtenerRutaEdicion()
        {

            Stack<Nivel> pila = new Stack<Nivel>();
            string ruta = frm_principal.getInstance().Path_base + "Historias\\";
            pila.Push(this);
            do
            {
                if (((Nivel)pila.Peek()).NivelAnterior != null)
                    pila.Push(((Nivel)pila.Peek()).NivelAnterior);

            } while (((Nivel)pila.Peek()).NivelAnterior != null);

            Nivel n = null;
            do
            {
                n = null;
                if (pila.Count > 0)
                {
                    n = pila.Pop();
                    if (n != null)
                    {
                        if (n.GetType().Equals(new NivelHistoriaSocial().GetType()))
                            ruta = ruta + frm_principal.getInstance().Nombre_despues_edicion + "\\";
                        else
                            ruta = ruta + n.Nombre + "\\";
                        
                    }
                }
            } while (n != null);

            return ruta;

        }

        /*
         Mueve una imagen de la ruta original a la destino. Si se excede de 640x480 se hace un resize.
         */
        protected 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) { }
        }

        /* Dada una ruta, nos devuelve el nombre del archivo que contiene */
        protected string nombreArchivo(string p)
        {

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

        public bool tieneImagenFondo(){
            if(ColorFondo==0)
                return true;
            else return false;
        
        }

        public string getTipo() {

            if (this.GetType().Equals(new NivelExplicacion().GetType()))
                return "Explicación";
            if (this.GetType().Equals(new NivelClasificacion().GetType()))
                return "Clasificación";
            if (this.GetType().Equals(new NivelOrdenacion().GetType()))
                return "Ordenación";
            if (this.GetType().Equals(new NivelColaboracion().GetType()))
                return "Colaboración";
            if (this.GetType().Equals(new NivelEleccionLibre().GetType()))
                return "Elección Libre";
            if (this.GetType().Equals(new NivelEleccionUnica().GetType()))
                return "Elección Única";

            return "";
        }

        // Hace un resize de una imagen al tamaño que le pasamos.
        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;
                }
            }
        }
    }
}
