Option Strict On
Option Explicit On

Imports System
Imports System.Windows.Forms

Namespace Nexamas.UI.Components

    ''' <summary>
    ''' Friend-owned policy for MASRadioButton grouping and keyboard semantics. It keeps
    ''' group normalization, peer matching, exclusive-choice navigation, and select/cancel
    ''' keyboard rules out of the public control surface while preserving the existing public
    ''' GroupName / Checked compatibility contract.
    ''' </summary>
    Friend NotInheritable Class MASRadioButtonGroupPolicy
        Private Sub New()
        End Sub

        Friend Shared Function NormalizeText(value As String) As String
            Return If(value, String.Empty)
        End Function

        Friend Shared Function NormalizeGroupName(value As String) As String
            Return If(value, String.Empty).Trim()
        End Function

        Friend Shared Function CanInteract(isEnabled As Boolean, isVisible As Boolean) As Boolean
            Return isEnabled AndAlso isVisible
        End Function

        Friend Shared Function WantsKeyboardFocus(isEnabled As Boolean, isVisible As Boolean) As Boolean
            Return CanInteract(isEnabled, isVisible)
        End Function

        Friend Shared Function ShouldSelectFromKey(keyCode As Keys) As Boolean
            Return keyCode = Keys.Space OrElse keyCode = Keys.Enter
        End Function

        Friend Shared Function ShouldCancelFromKey(keyCode As Keys) As Boolean
            Return keyCode = Keys.Escape
        End Function

        Friend Shared Function ShouldMovePreviousFromKey(keyCode As Keys) As Boolean
            Return keyCode = Keys.Left OrElse keyCode = Keys.Up
        End Function

        Friend Shared Function ShouldMoveNextFromKey(keyCode As Keys) As Boolean
            Return keyCode = Keys.Right OrElse keyCode = Keys.Down
        End Function

        Friend Shared Function AreSameGroup(hostA As Object,
                                            hostB As Object,
                                            groupNameA As String,
                                            groupNameB As String) As Boolean
            If Not Object.ReferenceEquals(hostA, hostB) Then Return False

            Return String.Equals(
                NormalizeGroupName(groupNameA),
                NormalizeGroupName(groupNameB),
                StringComparison.Ordinal)
        End Function

        Friend Shared Function ResolveWrappedIndex(currentIndex As Integer,
                                                   count As Integer,
                                                   forward As Boolean) As Integer
            If count <= 0 Then Return -1
            If currentIndex < 0 OrElse currentIndex >= count Then currentIndex = 0

            If forward Then
                Return (currentIndex + 1) Mod count
            End If

            Return (currentIndex - 1 + count) Mod count
        End Function
    End Class

End Namespace
