using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Security.Permissions;
using System.Security.AccessControl;

namespace Gestor_de_Contenidos
{
    /*
     Clase principal de la app. Implementa el patron singleton, por lo que solo habrá una instancia. Se recurrirá a ella para obtener datos comunes
     * a toda la aplicación.
     */
    public partial class frm_principal : Form
    {
        private static frm_principal instance = null;

        public TreeView Tv_histora {
            get { return tv_historia; }
            set { tv_historia = value; }
        }
        private Dictionary<TreeNode,Nivel> dic_historia;
        public Dictionary<TreeNode, Nivel> Dic_historia {
            get { return dic_historia; }
            set { dic_historia = value; }
        }

        private bool esEdicionHistoria;
        public bool EsEdicionHistoria {

            get { return esEdicionHistoria; }
            set { esEdicionHistoria = value; }
        }

        private string nombre_historia_antes_edicion;
        public string Nombre_histora_antes_edicion {
            get { return nombre_historia_antes_edicion; }
            set { nombre_historia_antes_edicion = value; }
        }

        private string nombre_despues_edicion;
        public string Nombre_despues_edicion {
            get { return nombre_despues_edicion; }
            set { nombre_despues_edicion = value; }
        }

        private frm_principal()
        {
            InitializeComponent();
            tv_historia = new TreeView();
            dic_historia = new Dictionary<TreeNode, Nivel>();
            esEdicionHistoria = false;

            crear_carpetas();
        }

        private string path_base;
        public string Path_base {
            get { return path_base; }
        }

        /*Si las carpetas que necesita la aplicación no están creadas en el sistema, se crean*/
        private void crear_carpetas()
        {
            try
            {
                path_base = Path.GetPathRoot(Environment.GetFolderPath(Environment.SpecialFolder.System));
                if (!System.IO.Directory.Exists(path_base + "AutgameContenido"))
                    System.IO.Directory.CreateDirectory(path_base + "AutgameContenido");
                path_base = path_base + "AutgameContenido\\";
                if (!System.IO.Directory.Exists(path_base + "Historias"))
                    System.IO.Directory.CreateDirectory(path_base + "Historias");
                if (!System.IO.Directory.Exists(path_base + "Ordenadores"))
                    System.IO.Directory.CreateDirectory(path_base + "Ordenadores");
                if (!System.IO.Directory.Exists(path_base + "Clasificadores"))
                    System.IO.Directory.CreateDirectory(path_base + "Clasificadores");
                if (!System.IO.Directory.Exists(path_base + "Pacientes"))
                    System.IO.Directory.CreateDirectory(path_base + "Pacientes");
            }
            catch (Exception ex) { }

        }
        
        /* Metodo para obtener la única instancia de esta clase */
        public static frm_principal getInstance() {
            
            
            if (instance == null)
                instance = new frm_principal();

            return instance;
        
        
        }

        private void frm_principal_Load(object sender, EventArgs e)
        {
            borrarCarpetasObsoletas();

            uc_pantalla_principal uc_inicial = new uc_pantalla_principal();
            this.Controls.Add(uc_inicial);

           
        }

        /* Borra carpetas que ya no se van a utilizar */
        public void borrarCarpetasObsoletas()
        {
            string[] carpetas = System.IO.Directory.GetDirectories(Path_base + "Historias");
            foreach (string juego in carpetas)
            {
                string[] aux = juego.Split('\\');
                if (aux[aux.Length - 1].Contains("--deprecated--"))
                {
                    try
                    {
                        System.IO.Directory.Delete(Path_base + "Historias\\" + aux[aux.Length - 1], true);
                    }
                    catch (Exception ex) { }
                }

            }
        }


        /* Se encarga de que veamos la pantalla que se pasa como parametro */
        public void cambiarPantalla(UserControl userControl) {

            Controls.Clear();
            Controls.Add(userControl);
            
        }

        /* Escribe la pantalla en persistencia */
        public void escribirHistoria() {

            borrarCarpetasObsoletas();
            Nivel n;            
            dic_historia.TryGetValue(tv_historia.TopNode, out n);
            if (n != null)
            {
                nombre_despues_edicion = n.Nombre;
                if (esEdicionHistoria)
                {
                    n.Nombre = "auxiliar";
                }

                n.escribirXML(esEdicionHistoria);

                if (esEdicionHistoria)
                {
                    do{
                    try
                    {
                        
                        System.IO.Directory.Move(path_base + "Historias\\" + nombre_historia_antes_edicion, path_base + "Historias\\" + nombre_historia_antes_edicion + "--deprecated--");
                    }
                    catch (Exception) {
                        try
                        {

                            System.IO.DirectoryInfo di = new DirectoryInfo(path_base + "Historias\\" + nombre_historia_antes_edicion);
                            di.Delete(true);
                        }
                        catch (Exception ex) { }
                    }
                    } while (System.IO.Directory.Exists(path_base + "Historias\\" + nombre_historia_antes_edicion));

                    do
                    {
                        try
                        {
                            System.IO.Directory.Move(path_base + "Historias\\auxiliar", path_base + "Historias\\" + nombre_despues_edicion);
                        }
                        catch (Exception e) { }
                    } while (!System.IO.Directory.Exists(path_base + "Historias\\" + nombre_despues_edicion));

                }

                borrarCarpetasObsoletas();
            }
        }

        /*Mira si todos los niveles que forman parte de una historia están completos*/
        public bool todosNivelesCompletos() {

            foreach (Nivel n in dic_historia.Values) {

                if (!n.estaImplementado())
                    return false;
            }

            return true;
        }

        private void frm_principal_Leave(object sender, EventArgs e)
        {
            borrarCarpetasObsoletas();
        }
    }

}
