Option Strict On
Option Explicit On

Namespace Nexamas.UI.TextInput

    ' CONTRACT:
    ' MASTextMultilineNavigation performs logical line navigation only.
    '
    ' It does not know visual wrapping, rendering, Skia, or UI.
    ' Visual navigation belongs to Stage 5C after wrapped layout exists.
    Friend NotInheritable Class MASTextMultilineNavigation

        Friend Function MoveLineUp(document As MASTextMultilineDocument,
                                   currentTextIndex As Integer,
                                   preferredColumn As Integer) As Integer
            If document Is Nothing Then Return 0

            Dim pos As MASTextMultilineCaretPosition =
                MASTextMultilineCaretPosition.FromDocument(document, currentTextIndex)

            Dim targetLine As Integer = pos.LineIndex - 1
            If targetLine < 0 Then Return 0

            Return document.GetTextIndexFromLineColumn(targetLine, preferredColumn)
        End Function

        Friend Function MoveLineDown(document As MASTextMultilineDocument,
                                     currentTextIndex As Integer,
                                     preferredColumn As Integer) As Integer
            If document Is Nothing Then Return 0

            Dim pos As MASTextMultilineCaretPosition =
                MASTextMultilineCaretPosition.FromDocument(document, currentTextIndex)

            Dim targetLine As Integer = pos.LineIndex + 1
            If targetLine >= document.LineCount Then Return document.Text.Length

            Return document.GetTextIndexFromLineColumn(targetLine, preferredColumn)
        End Function

        Friend Function MoveToLineStart(document As MASTextMultilineDocument,
                                        currentTextIndex As Integer) As Integer
            If document Is Nothing Then Return 0

            Dim lineIndex As Integer = document.GetLineIndexFromTextIndex(currentTextIndex)
            Return document.GetLine(lineIndex).StartIndex
        End Function

        Friend Function MoveToLineEnd(document As MASTextMultilineDocument,
                                      currentTextIndex As Integer) As Integer
            If document Is Nothing Then Return 0

            Dim lineIndex As Integer = document.GetLineIndexFromTextIndex(currentTextIndex)
            Return document.GetLine(lineIndex).EndIndexExclusive
        End Function

    End Class

End Namespace
