Option Strict On
Option Explicit On

Imports System

Namespace Nexamas.UI.Rendering

    ''' <summary>
    ''' Internal request for resolving a complete surface treatment.
    ''' It is not a public element API and does not mutate a control.
    ''' </summary>
    Friend NotInheritable Class MASSurfaceTreatmentResolutionRequest

        Friend ReadOnly Property ConsumerKind As MASSurfaceTreatmentConsumerKind
        Friend ReadOnly Property RequestedMaterialKey As String
        Friend ReadOnly Property RequestedFrameKey As String
        Friend ReadOnly Property RequestedFrameStrength As MASSurfaceFrameStrength
        Friend ReadOnly Property HasExplicitMaterialOverride As Boolean
        Friend ReadOnly Property HasExplicitFrameOverride As Boolean

        Friend Sub New(consumerKind As MASSurfaceTreatmentConsumerKind,
                       requestedMaterialKey As String,
                       requestedFrameKey As String,
                       requestedFrameStrength As MASSurfaceFrameStrength,
                       hasExplicitMaterialOverride As Boolean,
                       hasExplicitFrameOverride As Boolean)

            Me.ConsumerKind = consumerKind
            Me.RequestedMaterialKey = Normalize(requestedMaterialKey, MASSurfaceMaterialIds.Auto)
            Me.RequestedFrameKey = Normalize(requestedFrameKey, String.Empty)
            Me.RequestedFrameStrength = NormalizeStrength(requestedFrameStrength)
            Me.HasExplicitMaterialOverride = hasExplicitMaterialOverride AndAlso Not IsAutoMaterial(Me.RequestedMaterialKey)
            Me.HasExplicitFrameOverride = hasExplicitFrameOverride AndAlso Me.RequestedFrameKey.Length > 0
        End Sub

        Friend Shared Function CreateDefault(consumerKind As MASSurfaceTreatmentConsumerKind) As MASSurfaceTreatmentResolutionRequest
            Return CreateDefault(consumerKind, MASSurfaceFrameStrength.Level3)
        End Function

        Friend Shared Function CreateDefault(consumerKind As MASSurfaceTreatmentConsumerKind,
                                             frameStrength As MASSurfaceFrameStrength) As MASSurfaceTreatmentResolutionRequest
            Return New MASSurfaceTreatmentResolutionRequest(
                consumerKind:=consumerKind,
                requestedMaterialKey:=MASSurfaceMaterialIds.Auto,
                requestedFrameKey:=String.Empty,
                requestedFrameStrength:=frameStrength,
                hasExplicitMaterialOverride:=False,
                hasExplicitFrameOverride:=False)
        End Function

        Friend Shared Function CreateMaterialOverride(consumerKind As MASSurfaceTreatmentConsumerKind,
                                                      materialKey As String,
                                                      frameStrength As MASSurfaceFrameStrength) As MASSurfaceTreatmentResolutionRequest
            Return New MASSurfaceTreatmentResolutionRequest(
                consumerKind:=consumerKind,
                requestedMaterialKey:=materialKey,
                requestedFrameKey:=String.Empty,
                requestedFrameStrength:=frameStrength,
                hasExplicitMaterialOverride:=True,
                hasExplicitFrameOverride:=False)
        End Function

        Friend Shared Function CreateMaterialAndFrameOverride(consumerKind As MASSurfaceTreatmentConsumerKind,
                                                              materialKey As String,
                                                              frameKey As String,
                                                              frameStrength As MASSurfaceFrameStrength) As MASSurfaceTreatmentResolutionRequest
            Return New MASSurfaceTreatmentResolutionRequest(
                consumerKind:=consumerKind,
                requestedMaterialKey:=materialKey,
                requestedFrameKey:=frameKey,
                requestedFrameStrength:=frameStrength,
                hasExplicitMaterialOverride:=True,
                hasExplicitFrameOverride:=True)
        End Function

        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 IsAutoMaterial(materialKey As String) As Boolean
            Return String.Equals(Normalize(materialKey, MASSurfaceMaterialIds.Auto), MASSurfaceMaterialIds.Auto, StringComparison.OrdinalIgnoreCase)
        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
