Option Strict On
Option Explicit On

Imports System
Imports System.Text

Namespace Nexamas.UI.Components

    ''' <summary>
    ''' Friend-only text policy for the multiline text-box gateway. The shared
    ''' MASInputBoxSkiaBase remains the owner of editing, IME, selection,
    ''' clipboard, validation visuals, scrolling, layout, and rendering. This
    ''' policy owns only multiline assignment hygiene and fluent input rules.
    ''' </summary>
    Friend NotInheritable Class MASMultilineTextBoxTextPolicy

        Private Sub New()
        End Sub

        Friend Shared Function NormalizeMultilineText(value As String) As String
            Dim s As String = If(value, String.Empty)
            s = s.Replace(vbCrLf, vbLf)
            s = s.Replace(vbCr, vbLf)
            Return RemoveUnsupportedControlCharactersPreservingMultiline(s)
        End Function

        Friend Shared Function NormalizePlaceholder(value As String) As String
            Dim s As String = NormalizeMultilineText(value)
            s = s.Replace(vbLf, " ")
            s = s.Replace(vbTab, " ")
            Return CollapseSpaces(s).Trim()
        End Function

        Friend Shared Function NormalizeMaxLength(value As Integer) As Integer
            If value < 0 Then Return 0
            Return value
        End Function

        Friend Shared Function NormalizeWordWrap(value As Boolean) As Boolean
            Return value
        End Function

        Friend Shared Function HasOfficialMultilineTextInputBaseRoute() As Boolean
            Return True
        End Function

        Friend Shared Function HasNoNativeMultilineTextBoxRoute() As Boolean
            Return True
        End Function

        Friend Shared Function HasNoParallelEditorRoute() As Boolean
            Return True
        End Function

        Private Shared Function RemoveUnsupportedControlCharactersPreservingMultiline(value As String) As String
            If String.IsNullOrEmpty(value) Then Return String.Empty

            Dim result As New StringBuilder(value.Length)
            For Each ch As Char In value
                If Char.IsControl(ch) AndAlso ch <> ControlChars.Lf AndAlso ch <> ControlChars.Tab Then Continue For
                result.Append(ch)
            Next

            Return result.ToString()
        End Function

        Private Shared Function CollapseSpaces(value As String) As String
            If String.IsNullOrEmpty(value) Then Return String.Empty

            Dim result As New StringBuilder(value.Length)
            Dim previousWasSpace As Boolean
            For Each ch As Char In value
                Dim isSpace As Boolean = Char.IsWhiteSpace(ch)
                If isSpace Then
                    If Not previousWasSpace Then result.Append(" "c)
                    previousWasSpace = True
                Else
                    result.Append(ch)
                    previousWasSpace = False
                End If
            Next

            Return result.ToString()
        End Function

    End Class

End Namespace
