Option Strict On
Option Explicit On

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

Namespace Nexamas.UI.Layout

    Friend NotInheritable Class InputLayoutPrimitives
        Private Sub New()
        End Sub

        Friend Shared Function ComputeTextBoundsForRightIcon(rBase As SKRect,
                                                            dpi As Single,
                                                            iconBlockWidthDip As Single,
                                                            Optional leftPadDip As Single = -1.0F,
                                                            Optional rightPadDip As Single = 0.0F) As SKRect
            dpi = PixelSnap.SafeDpi(dpi)
            If leftPadDip < 0 Then leftPadDip = InputTokens.PaddingX

            Dim padL As Single = leftPadDip * dpi
            Dim padR As Single = rightPadDip * dpi
            Dim iconBlockW As Single = iconBlockWidthDip * dpi

            Return New SKRect(
                rBase.Left + padL,
                rBase.Top,
                rBase.Right - iconBlockW - padR,
                rBase.Bottom
            )
        End Function

        Friend Shared Function ComputeInputIconSlotRect(r As SKRect, dpi As Single) As SKRect
            dpi = PixelSnap.SafeDpi(dpi)

            Dim padX As Single = InputTokens.PaddingX * dpi
            Dim desiredIcon As Single = InputTokens.IconSize * dpi
            Dim maxIcon As Single = Math.Max(8.0F * dpi, r.Height * 0.55F)
            Dim iconSize As Single = Math.Min(desiredIcon, maxIcon)

            Return New SKRect(
                r.Left + padX,
                r.MidY - iconSize / 2.0F,
                r.Left + padX + iconSize,
                r.MidY + iconSize / 2.0F
            )
        End Function

        Friend Shared Function ComputeInputRightAccessoryRect(r As SKRect,
                                                              dpi As Single,
                                                              reservedWidthDip As Single) As SKRect
            dpi = PixelSnap.SafeDpi(dpi)

            If reservedWidthDip <= 0.0F Then
                Return SKRect.Empty
            End If

            Dim mm As MASSurfaceInteractionRing.Metrics = MASSurfaceInteractionRing.GetMetrics(dpi)
            Dim ringSafe As Single = mm.RingPathInsetPx

            Dim reservedPx As Single = reservedWidthDip * dpi
            If reservedPx <= 1.0F Then Return SKRect.Empty

            Return New SKRect(
                r.Right - ringSafe - reservedPx,
                r.Top + ringSafe,
                r.Right - ringSafe,
                r.Bottom - ringSafe
            )
        End Function

        Friend Shared Function ComputeInputContentRect(r As SKRect,
                                                       dpi As Single,
                                                       hasIcon As Boolean,
                                                       Optional rightReservedWidthDip As Single = 0.0F) As SKRect
            dpi = PixelSnap.SafeDpi(dpi)

            Dim padX As Single = InputTokens.PaddingX * dpi

            Dim mm As MASSurfaceInteractionRing.Metrics = MASSurfaceInteractionRing.GetMetrics(dpi)
            Dim ringSafe As Single = mm.RingPathInsetPx

            Dim left As Single = r.Left + padX + ringSafe
            Dim right As Single = r.Right - padX - ringSafe

            If hasIcon Then
                left += (InputTokens.IconSize + InputTokens.IconGap) * dpi
            End If

            If rightReservedWidthDip > 0.0F Then
                right -= (rightReservedWidthDip * dpi)
            End If

            Dim top As Single = r.Top + ringSafe
            Dim bottom As Single = r.Bottom - ringSafe

            If right < left Then right = left

            Return New SKRect(left, top, right, bottom)
        End Function

    End Class

End Namespace