Option Strict On
Option Explicit On

Imports System

Namespace Nexamas.UI.TextInput

    ' CONTRACT:
    ' Immutable logical caret position for multiline navigation.
    '
    ' Stage 5A: stores line/column/index mapping only.
    ' Stage 5B/5C will add visual x affinity and wrapped-line navigation.
    Friend NotInheritable Class MASTextMultilineCaretPosition

        Friend Sub New(textIndex As Integer,
                       lineIndex As Integer,
                       column As Integer)

            If textIndex < 0 Then Throw New ArgumentOutOfRangeException(NameOf(textIndex))
            If lineIndex < 0 Then Throw New ArgumentOutOfRangeException(NameOf(lineIndex))
            If column < 0 Then Throw New ArgumentOutOfRangeException(NameOf(column))

            Me.TextIndex = textIndex
            Me.LineIndex = lineIndex
            Me.Column = column
        End Sub

        Friend ReadOnly Property TextIndex As Integer
        Friend ReadOnly Property LineIndex As Integer
        Friend ReadOnly Property Column As Integer

        Friend Shared Function FromDocument(document As MASTextMultilineDocument,
                                            textIndex As Integer) As MASTextMultilineCaretPosition
            If document Is Nothing Then
                Return New MASTextMultilineCaretPosition(0, 0, 0)
            End If

            Dim safeIndex As Integer = document.ClampTextIndex(textIndex)
            Dim lineIndex As Integer = document.GetLineIndexFromTextIndex(safeIndex)
            Dim column As Integer = document.GetColumnFromTextIndex(safeIndex)

            Return New MASTextMultilineCaretPosition(safeIndex, lineIndex, column)
        End Function

    End Class

End Namespace
