using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace AxCopilot.Views;

internal static class TrayContextMenu
{
	internal const string GlyphOpen = "\ue7c5";

	internal const string GlyphSettings = "\ue713";

	internal const string GlyphReload = "\ue72c";

	internal const string GlyphFolder = "\ue838";

	internal const string GlyphInfo = "\ue946";

	internal const string GlyphStats = "\ue9d9";

	internal const string GlyphChat = "\ue8bd";

	internal const string GlyphGuide = "\ue736";

	internal const string GlyphAutoRun = "\ue82f";

	internal const string GlyphExit = "\ue711";

	private static readonly Bitmap DummyImage = new Bitmap(1, 1);

	private static float GetDpiScale()
	{
		try
		{
			using Graphics graphics = Graphics.FromHwnd(IntPtr.Zero);
			return Math.Max(1f, graphics.DpiX / 96f);
		}
		catch
		{
			return 1f;
		}
	}

	private static int Dp(int logicalPx, float dpiScale)
	{
		return Math.Max(1, (int)Math.Round((float)logicalPx / dpiScale));
	}

	public static Padding DpiPadding(int left, int top, int right, int bottom)
	{
		float dpiScale = GetDpiScale();
		return new Padding(Dp(left, dpiScale), Dp(top, dpiScale), Dp(right, dpiScale), Dp(bottom, dpiScale));
	}

	public static ToolStripMenuItem MakeItem(string text, string glyph, EventHandler onClick)
	{
		float dpiScale = GetDpiScale();
		ToolStripMenuItem toolStripMenuItem = new ToolStripMenuItem(text)
		{
			Tag = glyph,
			Image = DummyImage,
			Padding = new Padding(Dp(4, dpiScale), Dp(10, dpiScale), Dp(16, dpiScale), Dp(10, dpiScale))
		};
		toolStripMenuItem.Click += onClick;
		return toolStripMenuItem;
	}

	public static ContextMenuStrip CreateMenu()
	{
		float dpiScale = GetDpiScale();
		ContextMenuStrip menu = new ContextMenuStrip();
		menu.Renderer = new ModernTrayRenderer();
		menu.Font = new Font("Segoe UI", 10f, GraphicsUnit.Point);
		menu.ShowImageMargin = true;
		menu.ImageScalingSize = new Size(Dp(52, dpiScale), Dp(32, dpiScale));
		menu.MinimumSize = new Size(Dp(280, dpiScale), 0);
		menu.Opened += delegate
		{
			ApplyRoundedCorners(menu);
		};
		return menu;
	}

	private static void ApplyRoundedCorners(ContextMenuStrip menu)
	{
		try
		{
			nint num = CreateRoundRectRgn(0, 0, menu.Width, menu.Height, 16, 16);
			if (num != IntPtr.Zero && SetWindowRgn(menu.Handle, num, bRedraw: true) == 0)
			{
				DeleteObject(num);
			}
		}
		catch
		{
		}
	}

	[DllImport("gdi32.dll")]
	private static extern nint CreateRoundRectRgn(int x1, int y1, int x2, int y2, int cx, int cy);

	[DllImport("gdi32.dll")]
	private static extern bool DeleteObject(nint hObject);

	[DllImport("user32.dll")]
	private static extern int SetWindowRgn(nint hWnd, nint hRgn, bool bRedraw);

	public static void ApplySpacing(ContextMenuStrip menu, int top = 10, int bottom = 10, int left = 0, int right = 0)
	{
		if (menu.Items.Count == 0)
		{
			return;
		}
		float dpiScale = GetDpiScale();
		int top2 = Dp(top, dpiScale);
		int bottom2 = Dp(bottom, dpiScale);
		int num = Dp(left, dpiScale);
		int num2 = Dp(right, dpiScale);
		foreach (ToolStripItem item in menu.Items)
		{
			Padding margin = item.Margin;
			item.Margin = new Padding(margin.Left + num, margin.Top, margin.Right + num2, margin.Bottom);
		}
		ToolStripItem toolStripItem2 = menu.Items[0];
		toolStripItem2.Margin = new Padding(toolStripItem2.Margin.Left, top2, toolStripItem2.Margin.Right, toolStripItem2.Margin.Bottom);
		ToolStripItem toolStripItem3 = menu.Items[menu.Items.Count - 1];
		toolStripItem3.Margin = new Padding(toolStripItem3.Margin.Left, toolStripItem3.Margin.Top, toolStripItem3.Margin.Right, bottom2);
	}
}
