Option Strict On
Option Explicit On

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

Namespace Nexamas.UI.Composition

    ''' <summary>
    ''' Official Apply target for Phase 1.
    ''' It exposes ControlsLayer, viewport, ThemeContext, and invalidation without giving Layout ownership of RootHost.
    ''' </summary>
    Friend NotInheritable Class MASLayoutApplyTarget

        Friend ReadOnly Property ControlsLayer As ControlsLayer
        Friend ReadOnly Property ViewportLogical As SKRect
        Friend ReadOnly Property ThemeContext As MASThemeContext
        Friend ReadOnly Property RequestInvalidate As Action

        Friend Sub New(controlsLayer As ControlsLayer,
                       viewportLogical As SKRect,
                       Optional themeContext As MASThemeContext = Nothing,
                       Optional requestInvalidate As Action = Nothing)

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

            Me.ControlsLayer = controlsLayer
            Me.ViewportLogical = viewportLogical
            Me.ThemeContext = themeContext
            Me.RequestInvalidate = requestInvalidate
        End Sub

        Friend Shared Function FromRootHost(rootHost As MASSkiaRootHost,
                                            Optional topInsetLogical As Single = 0.0F) As MASLayoutApplyTarget
            If rootHost Is Nothing Then Throw New ArgumentNullException(NameOf(rootHost))

            Dim viewportPx As SKRect = rootHost.GetSurfaceViewportPx(topInsetLogical)
            Dim viewportLogical As SKRect = rootHost.PxToLogical(viewportPx)
            Dim ctx As MASThemeContext = rootHost.ThemeHostCore.TryGetContext()

            Return New MASLayoutApplyTarget(rootHost.ControlsLayerCore, viewportLogical, ctx, AddressOf rootHost.RequestInvalidate)
        End Function

    End Class

End Namespace
