Option Strict On
Option Explicit On

Imports System

Namespace Nexamas.UI.FloatRuntime

    ' ============================================================
    ' MASFloatRuntime Contract
    ' Class: MASFloatOwnerToken
    '
    ' Purpose:
    '   Provides the typed internal ownership identity used by Float
    '   policy, lifecycle, and close-by-owner routing.
    '
    ' Responsibility:
    '   Normalizes legacy owner keys into a stable token and makes
    '   owner equality explicit instead of relying on ad-hoc string
    '   comparisons in runtime policy code.
    '
    ' Owns:
    '   Normalized owner identity only.
    '
    ' Does Not Own:
    '   Float lifecycle.
    '   Overlay/session lifetime.
    '   Parent-child policy.
    '   Public API compatibility.
    '
    ' Allowed Dependencies:
    '   System.String.
    '   System.StringComparer.
    '
    ' Forbidden Dependencies:
    '   MASFloatCoordinator.
    '   MASFloatRuntimeState.
    '   Legacy Overlay classes.
    '   Application or component services.
    '
    ' Invariants:
    '   Empty token means no owner.
    '   Non-empty token equality is ordinal and exact.
    '   OwnerKey string remains only as a compatibility/display value;
    '   runtime ownership decisions must compare tokens.
    ' ============================================================
    Friend NotInheritable Class MASFloatOwnerToken
        Implements IEquatable(Of MASFloatOwnerToken)

        Friend Shared ReadOnly Empty As MASFloatOwnerToken =
            New MASFloatOwnerToken(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 IsEmpty As Boolean
            Get
                Return String.IsNullOrEmpty(_key)
            End Get
        End Property

        Friend Shared Function FromKey(ownerKey As String) As MASFloatOwnerToken
            Dim normalized As String = NormalizeKey(ownerKey)
            If normalized.Length = 0 Then Return Empty
            Return New MASFloatOwnerToken(normalized)
        End Function

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

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

        Public Overloads Function Equals(other As MASFloatOwnerToken) As Boolean _
            Implements IEquatable(Of MASFloatOwnerToken).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, MASFloatOwnerToken))
        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
