Option Strict On
Option Explicit On

Imports System

Namespace Nexamas.UI.Composition

    ' ============================================================
    ' MASComposition Scroll Contract
    ' Class: MASCompositionScrollOwnerToken
    '
    ' Purpose:
    '   Provides a typed host/scene ownership identity for composition
    '   scroll records.
    '
    ' Responsibility:
    '   Replaces prefix-based scroll ownership checks with exact token
    '   matching while preserving the existing owner-key string entry
    '   points used by composition hosts.
    '
    ' Owns:
    '   Normalized scroll owner identity only.
    '
    ' Does Not Own:
    '   Scroll adapter lifetime.
    '   Layout scroll request identity.
    '   Rendering or input routing.
    '
    ' Invariants:
    '   Empty token is the global/match-all owner used only when the
    '   caller intentionally passes no owner key.
    '   Non-empty owner matching is exact ordinal token equality.
    '   Scroll record keys are no longer tested by textual-prefix ownership checks.
    ' ============================================================
    Friend NotInheritable Class MASCompositionScrollOwnerToken
        Implements IEquatable(Of MASCompositionScrollOwnerToken)

        Friend Shared ReadOnly GlobalOwner As MASCompositionScrollOwnerToken =
            New MASCompositionScrollOwnerToken(String.Empty)

        Private ReadOnly _key As String

        Private Sub New(key As String)
            _key = NormalizeKey(key)
        End Sub

        Friend ReadOnly Property Key As String
            Get
                Return _key
            End Get
        End Property

        Friend ReadOnly Property IsGlobal As Boolean
            Get
                Return String.IsNullOrEmpty(_key)
            End Get
        End Property

        Friend Shared Function FromOwnerKey(ownerKey As String) As MASCompositionScrollOwnerToken
            Dim normalized As String = NormalizeKey(ownerKey)
            If normalized.Length = 0 Then Return GlobalOwner
            Return New MASCompositionScrollOwnerToken(normalized)
        End Function

        Friend Shared Function Same(left As MASCompositionScrollOwnerToken,
                                    right As MASCompositionScrollOwnerToken) As Boolean
            Dim l As MASCompositionScrollOwnerToken = If(left, GlobalOwner)
            Dim r As MASCompositionScrollOwnerToken = If(right, GlobalOwner)
            Return l.Equals(r)
        End Function

        Friend Shared Function NormalizeKey(ownerKey As String) As String
            If ownerKey Is Nothing Then Return String.Empty
            Return ownerKey.Trim()
        End Function

        Public Overloads Function Equals(other As MASCompositionScrollOwnerToken) As Boolean _
            Implements IEquatable(Of MASCompositionScrollOwnerToken).Equals
            If other Is Nothing Then Return False
            Return String.Equals(_key, other._key, StringComparison.Ordinal)
        End Function

        Public Overrides Function Equals(obj As Object) As Boolean
            Return Equals(TryCast(obj, MASCompositionScrollOwnerToken))
        End Function

        Public Overrides Function GetHashCode() As Integer
            Return StringComparer.Ordinal.GetHashCode(_key)
        End Function

        Public Overrides Function ToString() As String
            Return _key
        End Function

    End Class

End Namespace
