using MediaBrowser.Controller;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Localization;
using MediaBrowser.Model.Logging;
using MediaBrowser.Server.Startup.Common.Browser;
using System;
using MonoMac.Foundation;
using MonoMac.AppKit;

namespace MediaBrowser.Server.Mac
{
	public class MenuBarIcon
	{
		private NSMenuItem browseMenuItem;
		private NSMenuItem configureMenuItem;
		private NSMenuItem quitMenuItem;
		private NSMenuItem communityMenuItem;

		public static MenuBarIcon Instance;

		public MenuBarIcon (ILogger logger)
		{
			Instance = this;
			Logger = logger;
		}

		public void ShowIcon() {

			NSApplication.SharedApplication.BeginInvokeOnMainThread (CreateMenus);
		}

		private void CreateMenus() {

			CreateNsMenu ();
		}

		public void Localize() 
		{
			NSApplication.SharedApplication.BeginInvokeOnMainThread (() => {

				var configManager = MainClass.AppHost.ServerConfigurationManager;

				configManager.ConfigurationUpdated -= Instance_ConfigurationUpdated;
				LocalizeText ();
				configManager.ConfigurationUpdated += Instance_ConfigurationUpdated;
			});
		}

		private NSStatusItem statusItem;
		private void CreateNsMenu() {

			var menu = new NSMenu ();

			statusItem = NSStatusBar.SystemStatusBar.CreateStatusItem(30);
			statusItem.Menu = menu;
			statusItem.Image = NSImage.ImageNamed("statusicon");
			statusItem.HighlightMode = true;

			menu.RemoveAllItems ();

			browseMenuItem = new NSMenuItem ("Browse Media Library", "b", delegate {
				Browse (NSApplication.SharedApplication);
			});
			menu.AddItem (browseMenuItem);

			configureMenuItem = new NSMenuItem ("Configure Media Browser", "c", delegate {
				Configure (NSApplication.SharedApplication);
			});
			menu.AddItem (configureMenuItem);

			communityMenuItem = new NSMenuItem ("Visit Community", "v", delegate {
				Community (NSApplication.SharedApplication);
			});
			menu.AddItem (communityMenuItem);

			quitMenuItem = new NSMenuItem ("Quit", "q", delegate {
				Quit (NSApplication.SharedApplication);
			});
			menu.AddItem (quitMenuItem);
		}

		private ILogger Logger{ get; set;}

		private void Quit(NSObject sender)
		{
			MainClass.AppHost.Shutdown();
		}

		private void Community(NSObject sender)
		{
			BrowserLauncher.OpenCommunity(Logger);
		}

		private void Configure(NSObject sender)
		{
			BrowserLauncher.OpenDashboard(MainClass.AppHost, Logger);
		}

		private void Browse(NSObject sender)
		{
			BrowserLauncher.OpenWebClient(MainClass.AppHost, Logger);
		}

		public void Terminate() 
		{
			NSApplication.SharedApplication.InvokeOnMainThread (() => NSApplication.SharedApplication.Terminate(NSApplication.SharedApplication));
		}

		private string _uiCulture;
		/// <summary>
		/// Handles the ConfigurationUpdated event of the Instance control.
		/// </summary>
		/// <param name="sender">The source of the event.</param>
		/// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
		void Instance_ConfigurationUpdated(object sender, EventArgs e)
		{
			var configManager = MainClass.AppHost.ServerConfigurationManager;

			if (!string.Equals(configManager.Configuration.UICulture, _uiCulture,
				StringComparison.OrdinalIgnoreCase))
			{
				LocalizeText();
			}
		}

		private void LocalizeText()
		{
			var configManager = MainClass.AppHost.ServerConfigurationManager;

			_uiCulture = configManager.Configuration.UICulture;

			NSApplication.SharedApplication.BeginInvokeOnMainThread (LocalizeInternal);
		}

		private void LocalizeInternal() {

			var localization = MainClass.AppHost.LocalizationManager;

			quitMenuItem.Title = localization.GetLocalizedString("LabelExit");
			communityMenuItem.Title = localization.GetLocalizedString("LabelVisitCommunity");
			browseMenuItem.Title = localization.GetLocalizedString("LabelBrowseLibrary");
			configureMenuItem.Title = localization.GetLocalizedString("LabelConfigureServer");
		}
	}
}

