Option Strict On
Option Explicit On

Imports System

Namespace Nexamas.UI.Rendering

    ''' <summary>
    ''' Result of resolving a consumer surface slot into a complete treatment.
    ''' This is evidence/resolution data only; it does not paint, allocate controls, or alter runtime paths.
    ''' </summary>
    Friend NotInheritable Class MASSurfaceTreatmentResolution

        Friend ReadOnly Property ConsumerKind As MASSurfaceTreatmentConsumerKind
        Friend ReadOnly Property ConsumerName As String
        Friend ReadOnly Property RequestedMaterialKey As String
        Friend ReadOnly Property RequestedFrameKey As String
        Friend ReadOnly Property ResolvedMaterialKey As String
        Friend ReadOnly Property ResolvedFrameKey As String
        Friend ReadOnly Property ResolvedFrameStrength As MASSurfaceFrameStrength
        Friend ReadOnly Property ThemeInfluenceMode As MASSurfaceTreatmentThemeInfluenceMode
        Friend ReadOnly Property CompatibilityStatus As MASSurfaceTreatmentCompatibilityStatus
        Friend ReadOnly Property HasExplicitMaterialOverride As Boolean
        Friend ReadOnly Property HasExplicitFrameOverride As Boolean
        Friend ReadOnly Property UsesRecommendedFrame As Boolean
        Friend ReadOnly Property UsedMaterialFallback As Boolean
        Friend ReadOnly Property PreservesDefaultVisualWhenNoOverride As Boolean
        Friend ReadOnly Property IsReadyForCurrentRuntimeConsumption As Boolean
        Friend ReadOnly Property RequiresCurrentVisualCaptureBeforeRuntimeUse As Boolean
        Friend ReadOnly Property Notes As String

        Friend Sub New(consumerKind As MASSurfaceTreatmentConsumerKind,
                       consumerName As String,
                       requestedMaterialKey As String,
                       requestedFrameKey As String,
                       resolvedMaterialKey As String,
                       resolvedFrameKey As String,
                       resolvedFrameStrength As MASSurfaceFrameStrength,
                       themeInfluenceMode As MASSurfaceTreatmentThemeInfluenceMode,
                       compatibilityStatus As MASSurfaceTreatmentCompatibilityStatus,
                       hasExplicitMaterialOverride As Boolean,
                       hasExplicitFrameOverride As Boolean,
                       usesRecommendedFrame As Boolean,
                       usedMaterialFallback As Boolean,
                       preservesDefaultVisualWhenNoOverride As Boolean,
                       isReadyForCurrentRuntimeConsumption As Boolean,
                       requiresCurrentVisualCaptureBeforeRuntimeUse As Boolean,
                       notes As String)

            Me.ConsumerKind = consumerKind
            Me.ConsumerName = Normalize(consumerName, consumerKind.ToString())
            Me.RequestedMaterialKey = Normalize(requestedMaterialKey, MASSurfaceMaterialIds.Auto)
            Me.RequestedFrameKey = Normalize(requestedFrameKey, String.Empty)
            Me.ResolvedMaterialKey = Normalize(resolvedMaterialKey, MASSurfaceMaterialIds.PlatformDefault)
            Me.ResolvedFrameKey = Normalize(resolvedFrameKey, MASSurfaceFrameIds.PlatformDefault)
            Me.ResolvedFrameStrength = NormalizeStrength(resolvedFrameStrength)
            Me.ThemeInfluenceMode = If(themeInfluenceMode = MASSurfaceTreatmentThemeInfluenceMode.Unknown,
                                       MASSurfaceTreatmentThemeInfluenceMode.ThemeBound,
                                       themeInfluenceMode)
            Me.CompatibilityStatus = compatibilityStatus
            Me.HasExplicitMaterialOverride = hasExplicitMaterialOverride
            Me.HasExplicitFrameOverride = hasExplicitFrameOverride
            Me.UsesRecommendedFrame = usesRecommendedFrame
            Me.UsedMaterialFallback = usedMaterialFallback
            Me.PreservesDefaultVisualWhenNoOverride = preservesDefaultVisualWhenNoOverride
            Me.IsReadyForCurrentRuntimeConsumption = isReadyForCurrentRuntimeConsumption
            Me.RequiresCurrentVisualCaptureBeforeRuntimeUse = requiresCurrentVisualCaptureBeforeRuntimeUse
            Me.Notes = Normalize(notes, String.Empty)
        End Sub

        Friend ReadOnly Property IsCompatibleForCurrentRuntime As Boolean
            Get
                Return CompatibilityStatus = MASSurfaceTreatmentCompatibilityStatus.ResolvedDefaultPreservesCurrentVisual OrElse
                       CompatibilityStatus = MASSurfaceTreatmentCompatibilityStatus.ResolvedOverrideReady
            End Get
        End Property

        Private Shared Function Normalize(value As String, fallback As String) As String
            Dim result As String = If(value, String.Empty).Trim()
            If result.Length = 0 Then Return fallback
            Return result
        End Function

        Private Shared Function NormalizeStrength(value As MASSurfaceFrameStrength) As MASSurfaceFrameStrength
            If [Enum].IsDefined(GetType(MASSurfaceFrameStrength), value) Then Return value
            Return MASSurfaceFrameStrength.Level3
        End Function

    End Class

End Namespace
