using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using Dinah.Core;
using FileManager;
using Newtonsoft.Json.Linq;

#nullable enable
namespace LibationFileManager
{
	public partial class Configuration : PropertyChangeFilter
	{

		#region singleton stuff

		public static Configuration CreateMockInstance()
		{
#if !DEBUG
			if (!new StackTrace().GetFrames().Select(f => f.GetMethod()?.DeclaringType?.Assembly.GetName().Name).Any(f => f?.EndsWith(".Tests") ?? false))
				throw new InvalidOperationException($"Can only mock {nameof(Configuration)} in Debug mode or in test assemblies.");
#endif

			var mockInstance = new Configuration() { JsonBackedDictionary = new EphemeralDictionary() };
			mockInstance.SetString("Light", "ThemeVariant");
			Instance = mockInstance;
			return mockInstance;
		}
		public static void RestoreSingletonInstance()
		{
			Instance = s_SingletonInstance;
		}
		private static readonly Configuration s_SingletonInstance = new();
		public static Configuration Instance { get; private set; } = s_SingletonInstance;
		public bool IsEphemeralInstance => JsonBackedDictionary is EphemeralDictionary;

		public Configuration CreateEphemeralCopy()
		{
			var copy = new Configuration();
			copy.LoadEphemeralSettings(Settings.GetJObject());
			return copy;
		}

		private Configuration() { }
		#endregion
	}
}
