Option Strict On
Option Explicit On

Imports System
Imports Nexamas.UI.Values
Imports Nexamas.UI.Architecture
Imports Nexamas.UI.TextInput
Imports SkiaSharp

Namespace Nexamas.UI.Components

    Public NotInheritable Class MASMultilineTextBox
        Inherits MASInputBoxSkiaBase

        Private Shared ReadOnly _contract As MASResolvedComponentContract =
            MASArchitectureRuntime.ResolveContractOrThrow(GetType(MASMultilineTextBox))

#Region "Ctor / Factory"

        Public Sub New()
            Me.Multiline = True
            Me.MultilineWordWrap = MASMultilineTextBoxTextPolicy.NormalizeWordWrap(True)
        End Sub

        Public Sub New(text As String)
            Me.New()
            Me.Text = MASMultilineTextBoxTextPolicy.NormalizeMultilineText(text)
        End Sub

        Friend Shared Function [Default]() As MASMultilineTextBox
            Return New MASMultilineTextBox()
        End Function

        Public Shared Function Create(Optional text As String = Nothing) As MASMultilineTextBox
            Return New MASMultilineTextBox(MASMultilineTextBoxTextPolicy.NormalizeMultilineText(text))
        End Function

#End Region

#Region "Public Fluent API"

        Friend Overloads Sub SetBounds(x As Single,
                               y As Single,
                               width As Single,
                               height As Single)
            Me.SetLocalLayoutBoundsInternal(New SKRect(x, y, x + width, y + height))
        End Sub

        Friend Function WithBounds(x As Single,
                           y As Single,
                           width As Single,
                           height As Single) As MASMultilineTextBox
            SetBounds(x, y, width, height)
            Return Me
        End Function

        Public Function WithText(value As String) As MASMultilineTextBox
            Me.Text = MASMultilineTextBoxTextPolicy.NormalizeMultilineText(value)
            Return Me
        End Function

        Public Function WithPlaceholder(value As String) As MASMultilineTextBox
            Me.Placeholder = MASMultilineTextBoxTextPolicy.NormalizePlaceholder(value)
            Return Me
        End Function

        Public Function WithWordWrap(value As Boolean) As MASMultilineTextBox
            Me.MultilineWordWrap = MASMultilineTextBoxTextPolicy.NormalizeWordWrap(value)
            Return Me
        End Function

        Public Function WithMaxLength(value As Integer) As MASMultilineTextBox
            Me.MaxLength = MASMultilineTextBoxTextPolicy.NormalizeMaxLength(value)
            Return Me
        End Function

        Public Function AsReadOnly() As MASMultilineTextBox
            Me.ReadOnly = True
            Return Me
        End Function

        Public Function AsEditable() As MASMultilineTextBox
            Me.ReadOnly = False
            Return Me
        End Function

        Public Function WithValidation(state As MASTextValidationState,
                                       Optional message As String = Nothing) As MASMultilineTextBox
            Me.SetValidation(state, message)
            Return Me
        End Function

        Friend Function OnTextChanged(handler As Action(Of String)) As MASMultilineTextBox
            If handler Is Nothing Then Throw New ArgumentNullException(NameOf(handler))

            AddHandler Me.TextChanged,
                Sub(sender As Object, e As EventArgs)
                    handler(Me.Text)
                End Sub

            Return Me
        End Function

        Public Function FocusInput() As MASMultilineTextBox
            Me.FocusText()
            Return Me
        End Function

#End Region

#Region "Overrides"

        Protected Overrides ReadOnly Property HasLeftIcon As Boolean
            Get
                Return False
            End Get
        End Property

        Protected Overrides ReadOnly Property RightReservedWidthDip As Single
            Get
                Return 0.0F
            End Get
        End Property

        Protected Overrides ReadOnly Property InteractionKindValue As Integer
            Get
                Return CInt(CommonEnums.ControlKind.TextBox)
            End Get
        End Property

        Protected Overrides Function FilterIncomingText(value As String) As String
            Return MASMultilineTextBoxTextPolicy.NormalizeMultilineText(value)
        End Function

        Friend Function CreateReadinessManifest() As Nexamas.UI.Components.Governance.MASMultilineTextBoxReadinessManifest
            Return Nexamas.UI.Components.Governance.MASMultilineTextBoxReadinessManifest.CreateCurrent()
        End Function

#End Region


#Region "Unified MASSize Fluent API"

        ''' <summary>
        ''' Strongly typed entry into the shared MASSize intent API.
        ''' This method keeps fluent chains on the concrete element while delegating all sizing decisions to MASControlBase/MASSize.
        ''' </summary>
        Public Shadows Function WithSize(sizeIntent As Nexamas.UI.Layout.MASSize) As MASMultilineTextBox
            MyBase.SetSize(sizeIntent)
            Return Me
        End Function






#End Region
    End Class

End Namespace
