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; }
    }

    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 ObjetosSimulablesFilterTypes osListFilter;

        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>();

        // 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>();
            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);
                    return JsonSerializer.Deserialize<EstadoPersistente>(json);
                }                
                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
            }
        }
    }

}