Option Strict On
Option Explicit On

Imports System.Collections.Generic
Imports System.Collections.ObjectModel
Imports System.Reflection

Namespace Nexamas.UI.Rendering

    ''' <summary>
    ''' Verifies that small component-owned shadow recipes introduced during visual refinement
    ''' are now routed through ShadowSystem while preserving their original geometry and alpha.
    ''' This deliberately does not pull surfaces or materials into ShadowSystem.
    ''' </summary>
    Friend NotInheritable Class MASVisualComponentShadowOwnershipAudit
        Private Sub New()
        End Sub

        Friend Shared Function BuildCurrentComponentShadowOwnership() As MASVisualComponentShadowOwnershipReport
            Dim hasFlatRoundRectGateway As Boolean = HasShadowGateway("DrawFlatRoundRectShadow")
            Dim hasFlatRectGateway As Boolean = HasShadowGateway("DrawFlatRectShadow")
            Dim hasFlatOvalGateway As Boolean = HasShadowGateway("DrawFlatOvalShadow")
            Dim hasBlurredRoundRectGateway As Boolean = HasShadowGateway("DrawImmediateBlurredRoundRectShadow")
            Dim localBlurredShadowsRemainInShadowSystem As Boolean = hasBlurredRoundRectGateway AndAlso BlurredRoundRectConsumers().Count > 0
            Dim localFlatShadowsRouteThroughShadowSystem As Boolean = hasFlatRoundRectGateway AndAlso
                                                                      hasFlatRectGateway AndAlso
                                                                      hasFlatOvalGateway AndAlso
                                                                      FlatRoundRectConsumers().Count > 0 AndAlso
                                                                      FlatRectConsumers().Count > 0 AndAlso
                                                                      FlatOvalConsumers().Count > 0

            Dim status As MASVisualComponentShadowOwnershipStatus = DetermineStatus(
                hasFlatRoundRectGateway,
                hasFlatRectGateway,
                hasFlatOvalGateway,
                hasBlurredRoundRectGateway,
                localBlurredShadowsRemainInShadowSystem,
                localFlatShadowsRouteThroughShadowSystem)

            Return New MASVisualComponentShadowOwnershipReport(
                name:="Nexamas UI Component Shadow Ownership",
                status:=status,
                hasFlatRoundRectGateway:=hasFlatRoundRectGateway,
                hasFlatRectGateway:=hasFlatRectGateway,
                hasFlatOvalGateway:=hasFlatOvalGateway,
                hasBlurredRoundRectGateway:=hasBlurredRoundRectGateway,
                localBlurredShadowsRemainInShadowSystem:=localBlurredShadowsRemainInShadowSystem,
                localFlatShadowsRouteThroughShadowSystem:=localFlatShadowsRouteThroughShadowSystem,
                flatRoundRectConsumers:=FlatRoundRectConsumers(),
                flatRectConsumers:=FlatRectConsumers(),
                flatOvalConsumers:=FlatOvalConsumers(),
                blurredRoundRectConsumers:=BlurredRoundRectConsumers())
        End Function

        Private Shared Function HasShadowGateway(methodName As String) As Boolean
            Return GetType(MASShadowPainter).GetMethod(
                methodName,
                BindingFlags.NonPublic Or BindingFlags.Public Or BindingFlags.Static) IsNot Nothing
        End Function

        Private Shared Function DetermineStatus(hasFlatRoundRectGateway As Boolean,
                                                hasFlatRectGateway As Boolean,
                                                hasFlatOvalGateway As Boolean,
                                                hasBlurredRoundRectGateway As Boolean,
                                                localBlurredShadowsRemainInShadowSystem As Boolean,
                                                localFlatShadowsRouteThroughShadowSystem As Boolean) As MASVisualComponentShadowOwnershipStatus
            If Not hasFlatRoundRectGateway OrElse Not hasFlatRectGateway OrElse Not hasFlatOvalGateway OrElse Not hasBlurredRoundRectGateway Then Return MASVisualComponentShadowOwnershipStatus.BlockedByMissingShadowSystemGateway
            If Not localBlurredShadowsRemainInShadowSystem Then Return MASVisualComponentShadowOwnershipStatus.BlockedByLocalBlurredShadow
            If Not localFlatShadowsRouteThroughShadowSystem Then Return MASVisualComponentShadowOwnershipStatus.BlockedByLocalFlatShadow
            Return MASVisualComponentShadowOwnershipStatus.Closed
        End Function

        Private Shared Function FlatRoundRectConsumers() As IReadOnlyList(Of String)
            Return New ReadOnlyCollection(Of String)(New List(Of String) From {
                "MASFlatActionButtonPainter",
                "MASImageViewer"
            })
        End Function

        Private Shared Function FlatRectConsumers() As IReadOnlyList(Of String)
            Return New ReadOnlyCollection(Of String)(New List(Of String) From {
                "MASDataGridRenderer.PinnedColumnDivider"
            })
        End Function

        Private Shared Function FlatOvalConsumers() As IReadOnlyList(Of String)
            Return New ReadOnlyCollection(Of String)(New List(Of String) From {
                "MASStatusBanner.IconBadge"
            })
        End Function

        Private Shared Function BlurredRoundRectConsumers() As IReadOnlyList(Of String)
            Return New ReadOnlyCollection(Of String)(New List(Of String) From {
                "MASGroupBox.TitlePlate"
            })
        End Function
    End Class

End Namespace
