Option Strict On
Option Explicit On

Imports Nexamas.UI.Controls
Imports Nexamas.UI.Composition
Imports Nexamas.UI.General
Imports Nexamas.UI.Layout
Imports Nexamas.UI.Theming
Imports Nexamas.UI.Values
Imports SkiaSharp
Imports Nexamas.UI.Architecture

Namespace Nexamas.UI.Components

    Public NotInheritable Class MASToolbarSeparator
        Inherits MASControlBase
        Implements IMASLayoutParticipant
        Implements IMASIntrinsicSizeContract

        Private Shared ReadOnly _contract As MASResolvedComponentContract =
    MASArchitectureRuntime.ResolveContractOrThrow(GetType(MASToolbarSeparator))
        Friend Function GetPreferredLayoutSize(context As MASLayoutMeasureContext) As SKSize Implements IMASLayoutParticipant.GetPreferredLayoutSize
            Return MeasureIntrinsicSize(CreateSizeContext(context), SizeIntent).DesiredSize
        End Function

        Friend Function GetMinLayoutSize(context As MASLayoutMeasureContext) As SKSize Implements IMASLayoutParticipant.GetMinLayoutSize
            Return MeasureIntrinsicSize(CreateSizeContext(context), SizeIntent).MinSize
        End Function

        Friend Function MeasureIntrinsicSize(context As MASSizeContext, intent As MASSize) As MASSizeResult Implements IMASIntrinsicSizeContract.MeasureIntrinsicSize
            Dim safeContext As MASSizeContext = MASIntrinsicControlSizeMetrics.EnsureContext(context)
            Return MASSizeResolver.FromMeasured(
                MASIntrinsicControlSizeMetrics.ResolveToolbarSeparatorDesiredSize(),
                MASIntrinsicControlSizeMetrics.ResolveToolbarSeparatorMinimumSize(),
                MASIntrinsicControlSizeMetrics.ResolveToolbarSeparatorMaximumSize(),
                intent,
                safeContext,
                False,
                False)
        End Function

        Private Shared Function CreateSizeContext(context As MASLayoutMeasureContext) As MASSizeContext
            If context Is Nothing Then Return MASIntrinsicControlSizeMetrics.EnsureContext(Nothing)
            Return context.ToSizeContext()
        End Function

        Protected Overrides Sub Render(canvas As SKCanvas, ctx As MASThemeContext, pixelBounds As SKRect)
            If canvas Is Nothing OrElse ctx Is Nothing Then Return
            If pixelBounds.Width <= ToolbarTokens.MinimumUsablePixelSize OrElse pixelBounds.Height <= ToolbarTokens.MinimumUsablePixelSize Then Return

            Dim dpi As Single = PixelSnap.SafeDpi(ctx.Dpi)
            Dim x As Single = pixelBounds.MidX
            Dim topY As Single = pixelBounds.Top + ToolbarTokens.SeparatorVerticalInset * dpi
            Dim bottomY As Single = pixelBounds.Bottom - ToolbarTokens.SeparatorVerticalInset * dpi

            Using p As New SKPaint With {
                .IsAntialias = True,
                .Style = SKPaintStyle.Stroke,
                .StrokeWidth = ToolbarTokens.SeparatorStrokeWidth,
                .Color = ctx.TextColorTheme.MutedText.WithAlpha(ToolbarTokens.SeparatorAlpha)
            }
                canvas.DrawLine(x, topY, x, bottomY, p)
            End Using
        End Sub

        Protected Overrides Function ExcludeFromPointerRouting() As Boolean
            Return True
        End Function


#Region "Unified MASSize Fluent API"

        ''' <summary>
        ''' Strongly typed entry into the shared MASSize intent API.
        ''' This method keeps fluent chains on the concrete element while delegating all sizing decisions to MASControlBase/MASSize.
        ''' </summary>
        Public Shadows Function WithSize(sizeIntent As Nexamas.UI.Layout.MASSize) As MASToolbarSeparator
            MyBase.SetSize(sizeIntent)
            Return Me
        End Function






#End Region
    End Class

End Namespace
