#region ================== Copyright (c) 2012 Pascal vd Heiden

/*
 * Copyright (c) 2012 Pascal vd Heiden, www.codeimp.com
 * This program is released under GNU General Public License
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 */

#endregion

#region ================== Namespaces

using System;
using System.Globalization;
using System.IO;
using CodeImp.DoomBuilder.Plugins.VisplaneExplorer.Properties;
using CodeImp.DoomBuilder.Windows;

#endregion

namespace CodeImp.DoomBuilder.Plugins.VisplaneExplorer
{
	public class BuilderPlug : Plug
	{
		#region ================== Variables

		// Objects
		private static BuilderPlug me;
		private VPOManager vpo;
		private InterfaceForm interfaceform;
		private bool enabled; //mxd

		// Palettes
		private Palette[] palettes;
		
		#endregion

		#region ================== Properties
		
		// Properties
		public override string Name { get { return "VisplaneExplorer"; } }
		internal static VPOManager VPO { get { return me.vpo; } }
		internal static InterfaceForm InterfaceForm { get { return me.interfaceform; } }
		internal static Palette[] Palettes { get { return me.GetPalettes(); } }
		public override int MinimumRevision { get { return 2411; } }
		
		#endregion

		#region ================== Initialize / Dispose

		//mxd. Initialize when we can check the map format
		public override void OnMapNewEnd() { OnMapOpenEnd(); }
		public override void OnMapOpenEnd()
		{
			enabled = (General.Map.DOOM || General.Map.HEXEN);
			if(enabled)
			{
				// Load interface controls
				interfaceform = new InterfaceForm();

				// Load VPO manager (manages multithreading and communication with vpo.dll)
				vpo = new VPOManager();

				// Keep a static reference
				me = this;
			}
		}

		// Preferences changed
		public override void OnClosePreferences(PreferencesController controller)
		{
			base.OnClosePreferences(controller);
			ApplyUserColors();
		}

		// This is called when the plugin is terminated
		public override void Dispose()
		{
			//mxd. Active and not already disposed?
			if(!IsDisposed)
			{
				if(enabled)
				{
					// Clean up
					interfaceform.Dispose();
					interfaceform = null;
					vpo.Dispose();
					vpo = null;

					// Done
					me = null;
				}

				base.Dispose();
			}
		}

		#endregion

		#region ================== Methods

		//mxd
		private Palette[] GetPalettes()
		{
			if(palettes == null)
			{
				// Load palettes
				palettes = new Palette[(int)ViewStats.NumStats];
				palettes[(int)ViewStats.Visplanes] = new Palette(Resources.Visplanes_pal);
				palettes[(int)ViewStats.Drawsegs] = new Palette(Resources.Drawsegs_pal);
				palettes[(int)ViewStats.Solidsegs] = new Palette(Resources.Solidsegs_pal);
				palettes[(int)ViewStats.Openings] = new Palette(Resources.Openings_pal);
				palettes[(int)ViewStats.Heatmap] = new Palette(Resources.Heatmap_pal); //mxd
				ApplyUserColors();
			}
			return palettes;
		}

		// This applies user-defined appearance colors to the palettes
		private void ApplyUserColors()
		{
			//mxd
			if(palettes == null)
			{
				GetPalettes();
				return;
			}
			
			// Override special palette indices with user-defined colors
			foreach(Palette p in palettes) p.SetColor(Tile.POINT_VOID_B, General.Colors.Background.WithAlpha(0).ToInt());
		}

		// This returns a unique temp filename
		public static string MakeTempFilename(string extension)
		{
			string filename;

			do
			{
				//mxd. Generate a filename
				filename = Path.Combine(General.TempPath, MurmurHash2.Hash(DateTime.Now.Ticks.ToString(CultureInfo.InvariantCulture)) + extension);
			}
			// Continue while file is not unique
			while(File.Exists(filename) || Directory.Exists(filename));

			// Return the filename
			return filename;
		}

		#endregion
	}
}