using System;
using CefSharp;
using TweetDuck.Browser.Adapters;
using TweetDuck.Utils;
using TweetLib.Core.Browser;
using TweetLib.Core.Features.Plugins;
using TweetLib.Core.Features.Plugins.Events;

namespace TweetDuck.Plugins {
	sealed class PluginDispatcher : IPluginDispatcher {
		public event EventHandler<PluginDispatchEventArgs> Ready;

		private readonly IWebBrowser browser;
		private readonly IScriptExecutor executor;
		private readonly Func<string, bool> executeOnUrl;

		public PluginDispatcher(IWebBrowser browser, Func<string, bool> executeOnUrl) {
			this.executeOnUrl = executeOnUrl;
			this.browser = browser;
			this.browser.FrameLoadEnd += browser_FrameLoadEnd;
			this.executor = new CefScriptExecutor(browser);
		}

		void IPluginDispatcher.AttachBridge(string name, object bridge) {
			browser.RegisterJsBridge(name, bridge);
		}

		private void browser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e) {
			IFrame frame = e.Frame;

			if (frame.IsMain && executeOnUrl(frame.Url)) {
				Ready?.Invoke(this, new PluginDispatchEventArgs(executor));
			}
		}
	}
}