Option Strict On
Option Explicit On

Imports System
Imports Nexamas.UI.Controls
Imports Nexamas.UI.Host
Imports Nexamas.UI.Rendering
Imports SkiaSharp

Namespace Nexamas.UI.Application

    ''' <summary>
    ''' Beginner-facing tooltip API for one MASApplicationWindow.
    ''' This class does not create a tooltip runtime; it delegates to the single root-owned MASTooltips instance.
    ''' </summary>
    Public NotInheritable Class MASApplicationWindowTooltips

        Private ReadOnly _tooltips As MASTooltips
        Private ReadOnly _throwIfDisposed As Action

        Private ReadOnly Property TooltipsCore As MASTooltips
            Get
                _throwIfDisposed.Invoke()
                Return _tooltips
            End Get
        End Property

        Public Property SurfaceMaterial As String
            Get
                Return TooltipsCore.SurfaceMaterial
            End Get
            Set(value As String)
                TooltipsCore.SurfaceMaterial = value
            End Set
        End Property

        Public Function WithSurfaceMaterial(materialKey As String) As MASApplicationWindowTooltips
            SurfaceMaterial = materialKey
            Return Me
        End Function

        Friend Sub New(tooltips As MASTooltips, throwIfDisposed As Action)
            If tooltips Is Nothing Then Throw New ArgumentNullException(NameOf(tooltips))
            If throwIfDisposed Is Nothing Then Throw New ArgumentNullException(NameOf(throwIfDisposed))
            _tooltips = tooltips
            _throwIfDisposed = throwIfDisposed
        End Sub

        ''' <summary>
        ''' Internal pixel-space tooltip target hook for MAS-owned surfaces.
        ''' </summary>
        Friend Function Register(rectProvider As Func(Of SKRect),
                                 text As String) As MASApplicationTooltipTarget

            If String.IsNullOrWhiteSpace(text) Then
                Throw New ArgumentException("Tooltip text cannot be empty.", NameOf(text))
            End If

            Return Register(rectProvider, CType(Function() text, Func(Of String)))
        End Function

        ''' <summary>
        ''' Internal dynamic pixel-space tooltip target hook for MAS-owned surfaces.
        ''' </summary>
        Friend Function Register(rectProvider As Func(Of SKRect),
                                 textProvider As Func(Of String)) As MASApplicationTooltipTarget

            If rectProvider Is Nothing Then Throw New ArgumentNullException(NameOf(rectProvider))
            If textProvider Is Nothing Then Throw New ArgumentNullException(NameOf(textProvider))

            Dim target As MASTooltipTarget =
                TooltipsCore.AddTarget(rectProvider, textProvider)

            Return New MASApplicationTooltipTarget(target)
        End Function


        ''' <summary>
        ''' Registers a tooltip target for a MAS control using its layout-owned float-anchor bounds converted by the root host.
        ''' The control must provide tooltip text, for example MASButton.Tooltip.
        ''' </summary>
        Public Function Register(control As MASControlBase) As MASApplicationTooltipTarget

            If control Is Nothing Then Throw New ArgumentNullException(NameOf(control))

            Dim target As MASTooltipTarget = TooltipsCore.AddControlTarget(control)
            Return New MASApplicationTooltipTarget(target)
        End Function

        ''' <summary>
        ''' Internal custom-rectangle tooltip hook. Public consumers register the MAS control itself.
        ''' </summary>
        Friend Function Register(control As MASControlBase,
                                 rectProvider As Func(Of SKRect)) As MASApplicationTooltipTarget

            If control Is Nothing Then Throw New ArgumentNullException(NameOf(control))
            If rectProvider Is Nothing Then Throw New ArgumentNullException(NameOf(rectProvider))

            Dim target As MASTooltipTarget =
                TooltipsCore.AddControlTarget(control, rectProvider)

            Return New MASApplicationTooltipTarget(target)
        End Function

        Public Sub Remove(target As MASApplicationTooltipTarget)
            If target Is Nothing Then Return
            target.Remove()
        End Sub

        Public Sub Clear()
            TooltipsCore.ClearTargets()
        End Sub

        ''' <summary>
        ''' Advanced compatibility access to the existing root-owned service. Prefer Register/Remove/Clear for new code.
        ''' </summary>
        <Obsolete("AdvancedTooltips is an internal advanced compatibility hook. Prefer MASApplicationWindow.Services.Tooltips.Register/Remove/Clear for new SDK code.", True)>
        Friend ReadOnly Property AdvancedTooltips As MASTooltips
            Get
                Return _tooltips
            End Get
        End Property

    End Class

End Namespace
