#nullable enable
using System;
using System.Collections.Generic;
using System.Threading;
using Cysharp.Threading.Tasks;
using UnityEngine;
using UnityEngine.UIElements;
using UVC.Locale;
namespace UVC.UIToolkit.Common
{
///
/// UIToolkit 기반 툴팁 매니저
/// VisualElement에 마우스 오버 시 툴팁 표시
///
public class UTKTooltipManager : IDisposable
{
#region Singleton
private static UTKTooltipManager? _instance;
public static UTKTooltipManager Instance => _instance ??= new UTKTooltipManager();
protected UTKTooltipManager() { }
#endregion
#region Constants
private const string UXML_PATH = "UIToolkit/Common/UTKTooltip";
private const string USS_PATH = "UIToolkit/Common/UTKTooltip";
private const int SHOW_DELAY_MS = 500;
private const int POSITION_OFFSET = 10;
#endregion
#region Fields
private VisualElement? _root;
private VisualElement? _tooltipContainer;
private Label? _tooltipLabel;
private bool _isInitialized;
private bool _isVisible;
private bool _disposed;
private CancellationTokenSource? _showDelayCts;
private readonly Dictionary _tooltipRegistry = new();
private readonly Dictionary> _enterCallbacks = new();
private readonly Dictionary> _leaveCallbacks = new();
private readonly Dictionary> _moveCallbacks = new();
#endregion
#region Properties
public bool IsInitialized => _isInitialized;
public bool IsVisible => _isVisible;
#endregion
#region Initialization
///
/// 툴팁 매니저를 초기화합니다.
///
/// VisualElement 트리의 루트
public void Initialize(VisualElement root)
{
if (_isInitialized)
{
Debug.LogWarning("[UTKTooltipManager] Already initialized.");
return;
}
_root = root;
// UXML 로드 시도
var visualTree = Resources.Load(UXML_PATH);
if (visualTree != null)
{
_tooltipContainer = visualTree.Instantiate();
_tooltipContainer.name = "utk-tooltip-container";
_tooltipLabel = _tooltipContainer.Q