using Microsoft.Extensions.DependencyInjection;
using System;
using System.IO;
using Hua.Todo.Maui.Services;
using Hua.Todo.Maui.Views;
using Hua.Todo.Maui.Models;

namespace Hua.Todo.Maui;

/// <summary>
/// 应用程序主入口类。
/// 该类仅包含跨平台通用逻辑；各平台差异通过分部类拆分到 Platforms 目录中，避免在同一文件内混写大量条件编译代码。
/// </summary>
public partial class App : global::Microsoft.Maui.Controls.Application
{
	private readonly IServiceProvider _serviceProvider;
	private readonly IHotKeySettingsService _settingsService;
	private readonly IGlobalHotKeyService _hotKeyService;
	private readonly ISystemTrayService _trayService;
	private Window? _mainWindow;
	private bool _isHotkeyRegistered;
	private bool _isWindowCentered;

	/// <summary>
	/// 创建 <see cref="App"/> 实例。
	/// </summary>
	/// <param name="serviceProvider">依赖注入容器。</param>
	public App(IServiceProvider serviceProvider)
	{
		_serviceProvider = serviceProvider;
		InitializeComponent();

		_settingsService = serviceProvider.GetRequiredService<IHotKeySettingsService>();
		_hotKeyService = serviceProvider.GetRequiredService<IGlobalHotKeyService>();
		_trayService = serviceProvider.GetRequiredService<ISystemTrayService>();
	}

	/// <summary>
	/// 创建主窗体，并绑定系统托盘与热键等生命周期逻辑。
	/// </summary>
	protected override Microsoft.Maui.Controls.Window CreateWindow(IActivationState? activationState)
	{
		_mainWindow = new Microsoft.Maui.Controls.Window(_serviceProvider.GetRequiredService<MainPage>())
		{
			Width = 450,
			Height = 640,
			Title = AppMetadata.GetWindowTitle()
		};

		// 平台差异通过分部类实现（例如 Windows 标题栏、窗口显示方式等）。
		InitializePlatform();

		_mainWindow.Destroying += (s, e) =>
		{
			if (_isHotkeyRegistered)
			{
				_hotKeyService.UnregisterHotKey();
				_isHotkeyRegistered = false;
			}
			_trayService.Dispose();
		};

		_mainWindow.Created += (s, e) =>
		{
			// 系统托盘初始化需要持有 Window 引用，并提供“显示主窗体/退出应用”的回调。
			_trayService.Initialize(_mainWindow, ShowMainWindow, ExitApplication);
			RegisterHotkeyWhenReady();

			// Window 已创建但 Handler 可能尚未完全就绪，平台侧可在此做进一步处理（例如订阅关闭事件、居中等）。
			OnPlatformWindowCreated(_mainWindow);
		};

		return _mainWindow;
	}

	/// <summary>
	/// 当平台视图准备就绪时注册热键。
	/// 在某些平台（尤其 Windows）中，窗口 Handler 创建具有延迟，过早注册可能失败，因此采用重试策略。
	/// </summary>
	/// <param name="attempt">当前重试次数。</param>
	private void RegisterHotkeyWhenReady(int attempt = 0)
	{
		if (_mainWindow == null) return;

		if (!IsPlatformViewReady(_mainWindow))
		{
			if (attempt < 30)
			{
				// 使用短间隔重试，避免阻塞 UI 线程，同时保证窗口句柄就绪后尽快完成注册。
				_mainWindow.Dispatcher.DispatchDelayed(TimeSpan.FromMilliseconds(100), () => RegisterHotkeyWhenReady(attempt + 1));
			}
			return;
		}

		RegisterHotkey();
	}

	/// <summary>
	/// 热键按下时的回调
	/// </summary>
	private void OnHotKeyPressed()
	{
		MainThread.BeginInvokeOnMainThread(() =>
		{
			ShowMainWindow();
		});
	}

	/// <summary>
	/// 显示主窗口。
	/// 优先使用平台特定逻辑（例如 Windows 恢复并激活窗口），否则走默认 MAUI 打开窗口流程。
	/// </summary>
	private void ShowMainWindow()
	{
		if (_mainWindow != null)
		{
			_mainWindow.Dispatcher.Dispatch(() =>
			{
				if (!PlatformShowMainWindow(_mainWindow))
				{
					// 默认显示逻辑
					if (global::Microsoft.Maui.Controls.Application.Current != null &&
						!global::Microsoft.Maui.Controls.Application.Current.Windows.Contains(_mainWindow))
					{
						global::Microsoft.Maui.Controls.Application.Current.OpenWindow(_mainWindow);
					}
				}
			});
		}
	}

	/// <summary>
	/// 退出应用程序
	/// </summary>
	private void ExitApplication()
	{
		_trayService?.Dispose();
		global::Microsoft.Maui.Controls.Application.Current?.Quit();
	}

	/// <summary>
	/// 注册全局热键，并监听配置变更以动态更新。
	/// </summary>
	private void RegisterHotkey()
	{
		if (_hotKeyService == null || _settingsService == null) return;

		var config = _settingsService.GetConfig();
		if (_hotKeyService.IsSupported && config.IsEnabled)
		{
			_hotKeyService.RegisterHotKey(config.Modifiers, config.Key, OnHotKeyPressed);
			_isHotkeyRegistered = true;

			config.PropertyChanged += (s, args) =>
			{
				if (args.PropertyName == nameof(HotKeyConfig.Modifiers) ||
					args.PropertyName == nameof(HotKeyConfig.Key) ||
					args.PropertyName == nameof(HotKeyConfig.IsEnabled))
				{
					if (config.IsEnabled && _hotKeyService.IsSupported)
					{
						_hotKeyService.UpdateHotKey(config.Modifiers, config.Key);
					}
					else
					{
						_hotKeyService.UnregisterHotKey();
						_isHotkeyRegistered = false;
					}
				}
			};
		}
	}

	// 平台特定分部方法声明（实现位于 Platforms/* 目录）
	partial void InitializePlatform();
	partial void OnPlatformWindowCreated(Window window);
	/// <summary>
	/// 判断平台视图是否已就绪（用于热键/窗口等依赖平台句柄的逻辑）。
	/// </summary>
	/// <param name="window">MAUI Window。</param>
	/// <returns>视图已就绪返回 true；否则返回 false。</returns>
	private partial bool IsPlatformViewReady(Window window);
	/// <summary>
	/// 使用平台特定方式显示主窗口。
	/// </summary>
	/// <param name="window">MAUI Window。</param>
	/// <returns>如果平台已处理显示逻辑返回 true；否则返回 false。</returns>
	private partial bool PlatformShowMainWindow(Window window);
}
