Option Strict On
Option Explicit On

Namespace Nexamas.UI.FloatRuntime

    ' ============================================================
    ' MASFloatRuntime Contract
    ' Class: MASFloatPresentationProfiles
    '
    ' Purpose:
    '   Centralizes the official aesthetic motion profiles used by built-in
    '   Float surfaces.  Feature code may select a semantic profile, but it
    '   must not invent local timings, origins, or transition mixtures.
    '
    ' Responsibility:
    '   Creates MASFloatPresentation snapshots for modal surfaces, anchored
    '   menus, dropdown lists, passive overlays, toast, and progress floats.
    '
    ' Owns:
    '   Default Float presentation language.
    '   Built-in transition durations/easing/origin intent.
    '
    ' Does Not Own:
    '   Runtime lifecycle.
    '   Motion frame execution.
    '   Feature layout.
    '   Rendering.
    '
    ' Invariants:
    '   Dropdown/menu profiles are anchor-aware and must not scale from the
    '   center of a fullscreen input surface.
    '   This class is the single source for built-in Float motion aesthetics.
    ' ============================================================
    Friend NotInheritable Class MASFloatPresentationProfiles

        Private Sub New()
        End Sub

        Friend Shared Function Modal(Optional dimOpacity As Single = 0.32F) As MASFloatPresentation
            Return New MASFloatPresentation() With {
                .Placement = MASFloatPlacement.Center,
                .Transition = MASFloatTransitionKind.Fade Or MASFloatTransitionKind.Scale,
                .CloseTransition = MASFloatTransitionKind.Fade Or MASFloatTransitionKind.Scale,
                .DurationMs = 180,
                .Easing = MASFloatEasing.Standard,
                .DimBackground = True,
                .DimOpacity = ClampOpacity(dimOpacity),
                .TransitionOrigin = MASFloatTransitionOriginKind.BoundsCenter
            }
        End Function

        Friend Shared Function Progress() As MASFloatPresentation
            Return New MASFloatPresentation() With {
                .Placement = MASFloatPlacement.Center,
                .Transition = MASFloatTransitionKind.Fade Or MASFloatTransitionKind.Scale,
                .CloseTransition = MASFloatTransitionKind.Fade Or MASFloatTransitionKind.Scale,
                .DurationMs = 120,
                .Easing = MASFloatEasing.Standard,
                .DimBackground = False,
                .DimOpacity = 0.0F,
                .TransitionOrigin = MASFloatTransitionOriginKind.BoundsCenter
            }
        End Function

        Friend Shared Function Toast() As MASFloatPresentation
            Return New MASFloatPresentation() With {
                .Placement = MASFloatPlacement.Fullscreen,
                .Transition = MASFloatTransitionKind.Fade Or MASFloatTransitionKind.SlideFromBottom,
                .CloseTransition = MASFloatTransitionKind.Fade Or MASFloatTransitionKind.SlideFromBottom,
                .DurationMs = 120,
                .Easing = MASFloatEasing.Decelerate,
                .DimBackground = False,
                .DimOpacity = 0.0F,
                .TransitionOrigin = MASFloatTransitionOriginKind.BoundsBottomCenter
            }
        End Function

        Friend Shared Function Tooltip() As MASFloatPresentation
            Return New MASFloatPresentation() With {
                .Placement = MASFloatPlacement.Fullscreen,
                .Transition = MASFloatTransitionKind.Fade Or MASFloatTransitionKind.Scale,
                .CloseTransition = MASFloatTransitionKind.Fade,
                .DurationMs = 90,
                .Easing = MASFloatEasing.Decelerate,
                .DimBackground = False,
                .DimOpacity = 0.0F,
                .TransitionOrigin = MASFloatTransitionOriginKind.AnchorTopCenter
            }
        End Function

        Friend Shared Function AnchoredDropDownMenu() As MASFloatPresentation
            Return New MASFloatPresentation() With {
                .Placement = MASFloatPlacement.Fullscreen,
                .Transition = MASFloatTransitionKind.Fade Or MASFloatTransitionKind.Scale Or MASFloatTransitionKind.SlideFromTop,
                .CloseTransition = MASFloatTransitionKind.Fade Or MASFloatTransitionKind.Scale Or MASFloatTransitionKind.SlideFromTop,
                .DurationMs = 150,
                .Easing = MASFloatEasing.Decelerate,
                .DimBackground = False,
                .DimOpacity = 0.0F,
                .TransitionOrigin = MASFloatTransitionOriginKind.AnchorBottomLeft
            }
        End Function

        Friend Shared Function AnchoredContextMenu() As MASFloatPresentation
            Return New MASFloatPresentation() With {
                .Placement = MASFloatPlacement.Fullscreen,
                .Transition = MASFloatTransitionKind.Fade Or MASFloatTransitionKind.Scale,
                .CloseTransition = MASFloatTransitionKind.Fade Or MASFloatTransitionKind.Scale,
                .DurationMs = 130,
                .Easing = MASFloatEasing.Decelerate,
                .DimBackground = False,
                .DimOpacity = 0.0F,
                .TransitionOrigin = MASFloatTransitionOriginKind.AnchorTopLeft
            }
        End Function

        Friend Shared Function Drawer(Optional placement As MASFloatPlacement = MASFloatPlacement.DockRight) As MASFloatPresentation
            Dim normalizedPlacement As MASFloatPlacement = If(placement = MASFloatPlacement.DockLeft, MASFloatPlacement.DockLeft, MASFloatPlacement.DockRight)
            Dim fromLeft As Boolean = (normalizedPlacement = MASFloatPlacement.DockLeft)
            Dim slide As MASFloatTransitionKind = If(fromLeft, MASFloatTransitionKind.SlideFromLeft, MASFloatTransitionKind.SlideFromRight)
            Dim origin As MASFloatTransitionOriginKind = If(fromLeft, MASFloatTransitionOriginKind.BoundsTopLeft, MASFloatTransitionOriginKind.BoundsTopCenter)

            Return New MASFloatPresentation() With {
                .Placement = normalizedPlacement,
                .Transition = MASFloatTransitionKind.Fade Or slide,
                .CloseTransition = MASFloatTransitionKind.Fade Or slide,
                .DurationMs = 170,
                .Easing = MASFloatEasing.Decelerate,
                .DimBackground = True,
                .DimOpacity = 0.22F,
                .TransitionOrigin = origin
            }
        End Function

        Friend Shared Function DropDownList() As MASFloatPresentation
            Return New MASFloatPresentation() With {
                .Placement = MASFloatPlacement.ExplicitBounds,
                .Transition = MASFloatTransitionKind.Fade Or MASFloatTransitionKind.Scale Or MASFloatTransitionKind.SlideFromTop,
                .CloseTransition = MASFloatTransitionKind.Fade Or MASFloatTransitionKind.Scale Or MASFloatTransitionKind.SlideFromTop,
                .DurationMs = 120,
                .Easing = MASFloatEasing.Decelerate,
                .DimBackground = False,
                .DimOpacity = 0.0F,
                .TransitionOrigin = MASFloatTransitionOriginKind.BoundsTopCenter
            }
        End Function

        Friend Shared Function ForKey(floatKey As String) As MASFloatPresentation
            Dim key As String = If(floatKey, String.Empty).Trim()

            Select Case key
                Case MASFloatKeys.ContextMenu
                    Return AnchoredContextMenu()

                Case MASFloatKeys.MenuBarDropDownMenu
                    Return AnchoredDropDownMenu()

                Case MASFloatKeys.Popover
                    Return DropDownList()

                Case MASFloatKeys.Drawer
                    Return Drawer(MASFloatPlacement.DockRight)

                Case MASFloatKeys.DropDownList,
                     MASFloatKeys.DatePickerCalendar,
                     MASFloatKeys.TimePickerClock
                    Return DropDownList()

                Case MASFloatKeys.Tooltip
                    Return Tooltip()

                Case MASFloatKeys.Toast
                    Return Toast()

                Case MASFloatKeys.Progress
                    Return Progress()

                Case Else
                    Return AnchoredDropDownMenu()
            End Select
        End Function

        Private Shared Function ClampOpacity(value As Single) As Single
            If Single.IsNaN(value) OrElse Single.IsInfinity(value) Then Return 0.32F
            If value < 0.0F Then Return 0.0F
            If value > 1.0F Then Return 1.0F
            Return value
        End Function

    End Class

End Namespace
