Option Strict On
Option Explicit On

Imports System

Namespace Nexamas.UI.Motion

    ''' <summary>
    ''' Immutable public description of one motion token. It exposes duration/easing intent while keeping scheduling and invalidation internal.
    ''' </summary>
    Friend NotInheritable Class MASMotionToken

        Friend Sub New(id As MASMotionTokenId,
                       purpose As MASMotionPurpose,
                       durationMs As Integer,
                       easing As MASMotionEasing,
                       isEssential As Boolean)
            Me.Id = id
            Me.Purpose = purpose
            Me.DurationMs = Math.Max(0, durationMs)
            Me.Easing = easing
            Me.IsEssential = isEssential
        End Sub

        Friend ReadOnly Property Id As MASMotionTokenId

        Friend ReadOnly Property Purpose As MASMotionPurpose

        Friend ReadOnly Property DurationMs As Integer

        Friend ReadOnly Property Easing As MASMotionEasing

        Friend ReadOnly Property IsEssential As Boolean

        Friend Function WithDuration(durationMs As Integer) As MASMotionToken
            Return New MASMotionToken(Id, Purpose, durationMs, Easing, IsEssential)
        End Function

        Friend Function WithEasing(easing As MASMotionEasing) As MASMotionToken
            Return New MASMotionToken(Id, Purpose, DurationMs, easing, IsEssential)
        End Function

    End Class

End Namespace
