Option Strict On
Option Explicit On

Imports System
Imports Nexamas.UI.General
Imports Nexamas.UI.Values
Imports SkiaSharp

Namespace Nexamas.UI.Components

    ''' <summary>
    ''' Shared Media viewport geometry resolver. It owns the stage inset, content window,
    ''' and safe frame band used by image/video/document viewports.
    ''' </summary>
    Friend NotInheritable Class MASMediaViewportLayoutResolver
        Private Sub New()
        End Sub

        Friend Shared Function ResolveViewportRect(stage As SKRect,
                                                   dpi As Single) As SKRect
            If stage.Width <= 1.0F OrElse stage.Height <= 1.0F Then Return SKRect.Empty
            dpi = PixelSnap.SafeDpi(dpi)

            Dim stageInset As Single = Math.Max(0.0F, MediaViewportTokens.StageInsetDip * dpi)
            Dim viewport As New SKRect(stage.Left + stageInset,
                                       stage.Top + stageInset,
                                       stage.Right - stageInset,
                                       stage.Bottom - stageInset)
            If viewport.Width <= 1.0F OrElse viewport.Height <= 1.0F Then Return SKRect.Empty
            Return viewport
        End Function

        Friend Shared Function ResolveContentRect(viewport As SKRect,
                                                  dpi As Single) As SKRect
            If viewport.Width <= 1.0F OrElse viewport.Height <= 1.0F Then Return SKRect.Empty
            dpi = PixelSnap.SafeDpi(dpi)

            Dim insetSide As Single = MediaViewportTokens.ContentInsetSideDip * dpi
            Dim insetTop As Single = MediaViewportTokens.ContentInsetTopDip * dpi
            Dim insetBottom As Single = MediaViewportTokens.ContentInsetBottomDip * dpi
            Dim frameSafeInset As Single = ResolveFrameSafeInsetPx(dpi)

            Dim content As New SKRect(viewport.Left + insetSide + frameSafeInset,
                                      viewport.Top + insetTop + frameSafeInset,
                                      viewport.Right - insetSide - frameSafeInset,
                                      viewport.Bottom - insetBottom - frameSafeInset)
            If content.Width <= 1.0F OrElse content.Height <= 1.0F Then Return SKRect.Empty

            Return PixelSnap.SnapRect(content, dpi)
        End Function

        Friend Shared Function ResolveFrameSafeInsetPx(dpi As Single) As Single
            dpi = PixelSnap.SafeDpi(dpi)
            Dim requested As Single = MediaViewportTokens.FrameSafeInsetDip * dpi
            If Single.IsNaN(requested) OrElse Single.IsInfinity(requested) OrElse requested < 0.0F Then requested = 0.0F
            Return Math.Max(1.0F, requested)
        End Function

        Friend Shared Function ResolveFixedContentWindow(content As SKRect) As SKRect
            If content.Width <= 1.0F OrElse content.Height <= 1.0F Then Return SKRect.Empty
            Return content
        End Function
    End Class

End Namespace
