using System;
using System.IO;
using System.Reflection;
using TweetLib.Api;
using TweetLib.Core.Systems.Api;

namespace TweetLib.Core.Features.Extensions {
	public static class ExtensionLoader {
		public static void LoadAllInFolder(string extensionFolder) {
			if (!Directory.Exists(extensionFolder)) {
				return;
			}

			try {
				foreach (string file in Directory.EnumerateFiles(extensionFolder, "*.dll", SearchOption.TopDirectoryOnly)) {
					try {
						Assembly assembly = Assembly.LoadFile(file);
						foreach (Type type in assembly.GetTypes()) {
							if (typeof(TweetDuckExtension).IsAssignableFrom(type) && Activator.CreateInstance(type) is TweetDuckExtension extension) {
								EnableExtension(extension);
							}
						}
					} catch (Exception e) {
						App.ErrorHandler.HandleException("Extension Error", "Could not load extension: " + Path.GetFileNameWithoutExtension(file), true, e);
					}
				}
			} catch (DirectoryNotFoundException) {
				// ignore
			} catch (Exception e) {
				App.ErrorHandler.HandleException("Extension Error", "Could not load extensions.", true, e);
			}
		}

		private static void EnableExtension(TweetDuckExtension extension) {
			ApiImplementation apiImplementation = App.Api;
			apiImplementation.CurrentExtension = extension;
			extension.Enable(apiImplementation);
			apiImplementation.CurrentExtension = null;
		}
	}
}