using ImGuiNET;
using Microsoft.Xna.Framework;
using skyscraper8.UI.MonoGame.Bridge;
using System;
using System.Reflection;

namespace skyscraper8.UI.MonoGame.Forms
{
	internal class AboutWindow : ImGuiRenderable
	{
		public AboutWindow()
		{
			open = true;
			if (version == null)
			{
				Type gameType = typeof(Game);
				Assembly assembly = gameType.Assembly;
				object[] attributes = assembly.GetCustomAttributes(false);
				foreach (object attribute in attributes)
				{
					if (attribute.GetType() == typeof(AssemblyFileVersionAttribute))
					{
						AssemblyFileVersionAttribute ava = (AssemblyFileVersionAttribute)attribute;
						version = Version.Parse((ReadOnlySpan<char>)ava.Version);
					}
				}
			}
			typeof(AboutWindow).Module.GetPEKind(out peKind, out machine);
		}

		private PortableExecutableKinds peKind;
		private ImageFileMachine machine;
		private bool open;
		private static Version version;
		

		public void Dispose()
		{
		}

		public void Update()
		{
		}

		public void Render()
		{
			ImGui.Begin("About skyscraper8", ref open, ImGuiWindowFlags.AlwaysVerticalScrollbar);
			ImGui.Text("skyscraper8, written by Feyris-Tan");
			ImGui.Spacing();

			ImGui.Text(String.Format("Using MonoGame {0}", version.ToString()));
			ImGui.Text(String.Format("Using Dear ImGUI {0}", ImGui.GetVersion()));
			ImGui.Text(String.Format("Using StreamReader.dll by crazycat69"));
			ImGui.Spacing();

			ImGui.Text(String.Format("The currently executing image file is for {0} processors.", machine.ToString()));
			ImGui.Text(String.Format("You are running an {0}-bit operating system.", Environment.Is64BitOperatingSystem ? 64 : 32));
			ImGui.Text(String.Format("This is a {0}-bit process.", Environment.Is64BitProcess ? 64 : 32));
			if (Environment.Is64BitProcess)
			{
				ImGui.Text(String.Format("Please remember that StreamReader.dll requires a 32-bit context."));
				ImGui.Text("Consider using Remote Stream Reader");
			}

			if (ImGui.Button("OK"))
				open = false;
			ImGui.End();
		}

		public bool WasClosed()
		{
			return !open;
		}
	}
}
