Option Strict On
Option Explicit On

Namespace Nexamas.UI.Virtualization

    ''' <summary>
    ''' Official primitive stamp builder for virtualization consumers. It centralizes how Theme, DPI, Density, Font,
    ''' Localization, RTL, collection, control-size, and viewport facts are converted into a MASVirtualizationEnvironmentStamp,
    ''' so controls do not scatter direct constructor calls or private cache-reset booleans through rendering/input code.
    ''' </summary>
    Friend NotInheritable Class MASVirtualizationEnvironmentStampBuilder

        Private _themeRevision As Integer
        Private _dpiRevision As Integer
        Private _densityRevision As Integer
        Private _fontRevision As Integer
        Private _localizationRevision As Integer
        Private _rtlRevision As Integer
        Private _itemCollectionRevision As Integer
        Private _controlSizeRevision As Integer
        Private _viewportExtentPx As Single

        Private Sub New()
            _themeRevision = 0
            _dpiRevision = 0
            _densityRevision = 0
            _fontRevision = 0
            _localizationRevision = 0
            _rtlRevision = 0
            _itemCollectionRevision = 0
            _controlSizeRevision = 0
            _viewportExtentPx = 0.0F
        End Sub

        Friend Shared Function Create() As MASVirtualizationEnvironmentStampBuilder
            Return New MASVirtualizationEnvironmentStampBuilder()
        End Function

        Friend Shared Function FromStamp(stamp As MASVirtualizationEnvironmentStamp) As MASVirtualizationEnvironmentStampBuilder
            Dim builder = Create()
            Dim safeStamp = If(stamp, MASVirtualizationEnvironmentStamp.Empty)
            builder._themeRevision = safeStamp.ThemeRevision
            builder._dpiRevision = safeStamp.DpiRevision
            builder._densityRevision = safeStamp.DensityRevision
            builder._fontRevision = safeStamp.FontRevision
            builder._localizationRevision = safeStamp.LocalizationRevision
            builder._rtlRevision = safeStamp.RtlRevision
            builder._itemCollectionRevision = safeStamp.ItemCollectionRevision
            builder._controlSizeRevision = safeStamp.ControlSizeRevision
            builder._viewportExtentPx = safeStamp.ViewportExtentPx
            Return builder
        End Function

        Friend Function WithThemeRevision(value As Integer) As MASVirtualizationEnvironmentStampBuilder
            _themeRevision = Math.Max(0, value)
            Return Me
        End Function

        Friend Function WithDpiRevision(value As Integer) As MASVirtualizationEnvironmentStampBuilder
            _dpiRevision = Math.Max(0, value)
            Return Me
        End Function

        Friend Function WithDensityRevision(value As Integer) As MASVirtualizationEnvironmentStampBuilder
            _densityRevision = Math.Max(0, value)
            Return Me
        End Function

        Friend Function WithFontRevision(value As Integer) As MASVirtualizationEnvironmentStampBuilder
            _fontRevision = Math.Max(0, value)
            Return Me
        End Function

        Friend Function WithLocalizationRevision(value As Integer) As MASVirtualizationEnvironmentStampBuilder
            _localizationRevision = Math.Max(0, value)
            Return Me
        End Function

        Friend Function WithRtlRevision(value As Integer) As MASVirtualizationEnvironmentStampBuilder
            _rtlRevision = Math.Max(0, value)
            Return Me
        End Function

        Friend Function WithItemCollectionRevision(value As Integer) As MASVirtualizationEnvironmentStampBuilder
            _itemCollectionRevision = Math.Max(0, value)
            Return Me
        End Function

        Friend Function WithControlSizeRevision(value As Integer) As MASVirtualizationEnvironmentStampBuilder
            _controlSizeRevision = Math.Max(0, value)
            Return Me
        End Function

        Friend Function WithViewportExtentPx(value As Single) As MASVirtualizationEnvironmentStampBuilder
            _viewportExtentPx = MASVirtualizationNumericGuard.NormalizeNonNegative(value)
            Return Me
        End Function

        Friend Function Build() As MASVirtualizationEnvironmentStamp
            Return New MASVirtualizationEnvironmentStamp(_themeRevision,
                                                         _dpiRevision,
                                                         _densityRevision,
                                                         _fontRevision,
                                                         _localizationRevision,
                                                         _rtlRevision,
                                                         _itemCollectionRevision,
                                                         _controlSizeRevision,
                                                         _viewportExtentPx)
        End Function

    End Class

End Namespace
