using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System;
using System.IO;
using System.Text.Json;
using System.Security.Permissions;

namespace CtrEditor
{
    public class ColumnLanguageMapping
    {
        public string ColumnName { get; set; }
        public string Language { get; set; }
    }

    public class ColumnPairMapping
    {
        public string SourceColumn { get; set; }
        public string TargetColumn { get; set; }
    }

    public class LibraryWindowSettings
    {
        public double Width { get; set; } = 1200;
        public double Height { get; set; } = 700;
        public double Left { get; set; } = 100;
        public double Top { get; set; } = 100;
        public double Column0Width { get; set; } = 300;
        public double Column2Width { get; set; } = 350;
        public double Column4Width { get; set; } = 350;
        public bool IsMaximized { get; set; } = false;
    }

    public class CameraSettings
    {
        public double PositionX { get; set; } = 3.86;
        public double PositionY { get; set; } = -18.13;
        public double PositionZ { get; set; } = 10;
        public double LookDirectionX { get; set; } = -3.86;
        public double LookDirectionY { get; set; } = 18.1;
        public double LookDirectionZ { get; set; } = -10;
        public double UpDirectionX { get; set; } = -0.1;
        public double UpDirectionY { get; set; } = 0.48;
        public double UpDirectionZ { get; set; } = 0.87;
        public double FieldOfView { get; set; } = 60;
    }

    internal class EstadoPersistente
    {
        // Ruta donde se guardará el estado
        private static readonly string _filePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "estado.json");

        // Instancia privada estática, parte del patrón Singleton
        private static EstadoPersistente _instance;

        // Propiedad privada para el directorio de trabajo
        private string _strDirectorioTrabajo;

        private string _imagen;
        private int _id;

        public List<string> RecentDirectories { get; set; } = new List<string>();

        public List<ColumnLanguageMapping> ColumnLanguages { get; set; } = new List<ColumnLanguageMapping>();

        public List<ColumnPairMapping> ColumnPairs { get; set; } = new List<ColumnPairMapping>();

        public List<string> LibraryDirectories { get; set; } = new List<string>();

        public LibraryWindowSettings LibraryWindow { get; set; } = new LibraryWindowSettings();

        public CameraSettings Camera { get; set; } = new CameraSettings();

        // Propiedad pública con get y set para controlar el acceso a _strDirectorioTrabajo
        public string directorio
        {
            get { return _strDirectorioTrabajo; }
            set { _strDirectorioTrabajo = value; }
        }

        public string imagen
        {
            get { return _imagen; }
            set { _imagen = value; }
        }

        public int newid
        {
            get
            {
                _id++;
                return _id;
            }
            set { _id = value; }
        }

        // Constructor privado para evitar la instanciación externa
        public EstadoPersistente()
        {
        }

        private EstadoPersistente Inizializar()
        {
            _strDirectorioTrabajo = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
            RecentDirectories = new List<string>();
            LibraryWindow = new LibraryWindowSettings();
            Camera = new CameraSettings();
            return this;
        }

        // Propiedad pública estática para acceder a la instancia
        public static EstadoPersistente Instance
        {
            get
            {
                if (_instance == null)
                {
                    _instance = CargarEstado();
                }
                return _instance;
            }
        }

        // Método para guardar el estado en un archivo JSON


        public void GuardarEstado()
        {
            var options = new JsonSerializerOptions
            {
                WriteIndented = true // para una salida JSON formateada legiblemente
            };
            string json = JsonSerializer.Serialize(this, options);
            File.WriteAllText(_filePath, json);
        }


        // Método estático para cargar el estado desde un archivo JSON
        private static EstadoPersistente CargarEstado()
        {
            try
            {
                if (File.Exists(_filePath))
                {
                    string json = File.ReadAllText(_filePath);
                    var estado = JsonSerializer.Deserialize<EstadoPersistente>(json);
                    // Asegurar que LibraryWindow esté inicializado
                    if (estado.LibraryWindow == null)
                        estado.LibraryWindow = new LibraryWindowSettings();
                    // Asegurar que Camera esté inicializado
                    if (estado.Camera == null)
                        estado.Camera = new CameraSettings();
                    return estado;
                }
                return new EstadoPersistente().Inizializar(); // Devuelve una nueva instancia si no existe el archivo
            }
            catch
            {
                return new EstadoPersistente().Inizializar(); // Devuelve una nueva instancia si no existe el archivo
            }
        }
    }

}
