Option Strict On
Option Explicit On

Imports System

Namespace Nexamas.UI.Virtualization

    ''' <summary>
    ''' Friend-only diagnostic emitted when tile-grid hit testing must fall back from controller-owned row resolution to a
    ''' calculated row. The diagnostic makes potential variable-extent mismatches visible instead of silently returning an item.
    ''' </summary>
    Friend NotInheritable Class MASVirtualizationHitTestFallbackDiagnostic

        Friend Const NoFallbackCode As String = "None"
        Friend Const ControllerMissFallbackCode As String = "MASVirtualization.TileGridHitTest.ControllerMissFallback"
        Friend Const VariableExtentMismatchRiskCode As String = "MASVirtualization.TileGridHitTest.VariableExtentMismatchRisk"

        Private Shared ReadOnly NoneDiagnostic As MASVirtualizationHitTestFallbackDiagnostic =
            New MASVirtualizationHitTestFallbackDiagnostic(False, NoFallbackCode, -1, False, 0.0F, 0.0F)

        Friend Shared ReadOnly Property None As MASVirtualizationHitTestFallbackDiagnostic
            Get
                Return NoneDiagnostic
            End Get
        End Property

        Private Sub New(fallbackUsed As Boolean,
                        diagnosticCode As String,
                        fallbackRowIndex As Integer,
                        hasVariableExtentMismatchRisk As Boolean,
                        rowExtentPx As Single,
                        viewportOffsetPx As Single)
            Me.FallbackUsed = fallbackUsed
            Me.DiagnosticCode = If(diagnosticCode, String.Empty)
            Me.FallbackRowIndex = fallbackRowIndex
            Me.HasVariableExtentMismatchRisk = hasVariableExtentMismatchRisk
            Me.RowExtentPx = MASVirtualizationNumericGuard.NormalizeNonNegative(rowExtentPx)
            Me.ViewportOffsetPx = MASVirtualizationNumericGuard.NormalizeNonNegative(viewportOffsetPx)
        End Sub

        Friend Shared Function CreateControllerMissFallback(fallbackRowIndex As Integer,
                                                            rowExtentPx As Single,
                                                            viewportOffsetPx As Single,
                                                            hasVariableExtentMismatchRisk As Boolean) As MASVirtualizationHitTestFallbackDiagnostic
            Dim code As String = If(hasVariableExtentMismatchRisk, VariableExtentMismatchRiskCode, ControllerMissFallbackCode)
            Return New MASVirtualizationHitTestFallbackDiagnostic(True, code, Math.Max(-1, fallbackRowIndex), hasVariableExtentMismatchRisk, rowExtentPx, viewportOffsetPx)
        End Function

        Friend ReadOnly Property FallbackUsed As Boolean
        Friend ReadOnly Property DiagnosticCode As String
        Friend ReadOnly Property FallbackRowIndex As Integer
        Friend ReadOnly Property HasVariableExtentMismatchRisk As Boolean
        Friend ReadOnly Property RowExtentPx As Single
        Friend ReadOnly Property ViewportOffsetPx As Single

        Friend ReadOnly Property IsVisibleDiagnostic As Boolean
            Get
                Return FallbackUsed AndAlso Not String.Equals(DiagnosticCode, NoFallbackCode, StringComparison.Ordinal)
            End Get
        End Property

    End Class

End Namespace
