using System.Drawing;
using System.Windows.Forms;
using CefSharp.WinForms;
using TweetDuck.Browser;
using TweetDuck.Browser.Base;
using TweetDuck.Browser.Handling;
using TweetDuck.Controls;
using TweetDuck.Management;
using TweetDuck.Utils;
using TweetLib.Core.Features;

namespace TweetDuck.Dialogs {
	sealed partial class FormGuide : Form, FormManager.IAppDialog {
		private const string GuideUrl = "td://guide/index.html";

		public static void Show(string hash = null) {
			string url = GuideUrl + (string.IsNullOrEmpty(hash) ? string.Empty : "#" + hash);
			FormGuide guide = FormManager.TryFind<FormGuide>();

			if (guide == null) {
				FormBrowser owner = FormManager.TryFind<FormBrowser>();

				if (owner != null) {
					new FormGuide(url, owner).Show(owner);
				}
			}
			else {
				guide.Reload(url);
				guide.Activate();
			}
		}

		private readonly ChromiumWebBrowser browser;

		private FormGuide(string url, Form owner) {
			InitializeComponent();

			Text = Program.BrandName + " Guide";
			Size = new Size(owner.Size.Width * 3 / 4, owner.Size.Height * 3 / 4);
			VisibleChanged += (sender, args) => this.MoveToCenter(owner);

			browser = new ChromiumWebBrowser(url) {
				KeyboardHandler = new CustomKeyboardHandler(null)
			};

			browser.BrowserSettings.BackgroundColor = (uint) BackColor.ToArgb();

			var browserComponent = new CefBrowserComponent(browser);
			var browserImpl = new BaseBrowser(browserComponent);

			BrowserUtils.SetupDockOnLoad(browserComponent, browser);

			Controls.Add(browser);

			Disposed += (sender, args) => {
				browserImpl.Dispose();
				browser.Dispose();
			};
		}

		protected override void Dispose(bool disposing) {
			if (disposing) {
				components?.Dispose();
			}

			base.Dispose(disposing);
		}

		private void Reload(string url) {
			browser.Load(url);
		}
	}
}