Option Strict On
Option Explicit On

Imports System
Imports System.Collections.Generic
Imports Nexamas.UI.Architecture
Imports Nexamas.UI.Composition
Imports Nexamas.UI.General
Imports Nexamas.UI.Icons
Imports Nexamas.UI.Layout
Imports Nexamas.UI.Rendering
Imports Nexamas.UI.TextInput
Imports Nexamas.UI.TextRendering
Imports Nexamas.UI.Theming
Imports Nexamas.UI.Values
Imports SkiaSharp

Namespace Nexamas.UI.Controls

    ''' <summary>
    ''' Public Nexamas UI in-page status banner. It is a visual feedback control only:
    ''' toast lifetime, notification queues, dialog/message box routing, and validation
    ''' execution remain owned by their existing Nexamas UI systems.
    ''' </summary>
    Partial Public NotInheritable Class MASStatusBanner
        Inherits MASControlBase
        Implements IMASLayoutParticipant
        Implements IMASIntrinsicSizeContract

#Region "Fields"

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

        Private ReadOnly _primitives As New MASVisualPrimitivesPainter()
        Private ReadOnly _frameBorder As New MASSurfaceFrameBorderPainter()

        Private _title As String = String.Empty
        Private _message As String = String.Empty
        Private _tone As MASToastTone = MASToastTone.Info
        Private _showIcon As Boolean = True
        Private _disposedLocal As Boolean

#End Region

#Region "Constructor"

        Public Sub New()
            MyBase.New()
        End Sub

#End Region

#Region "Public API"

        Public Shared Function Create(Optional title As String = Nothing,
                                      Optional message As String = Nothing,
                                      Optional tone As MASToastTone = MASToastTone.Info) As MASStatusBanner
            Dim banner As New MASStatusBanner()
            banner._title = MASStatusBannerVisualPolicy.NormalizeTitle(title)
            banner._message = MASStatusBannerVisualPolicy.NormalizeMessage(message)
            banner._tone = MASStatusBannerVisualPolicy.NormalizeTone(tone)
            Return banner
        End Function

        Public Property Title As String
            Get
                Return _title
            End Get
            Set(value As String)
                Dim normalized As String = MASStatusBannerVisualPolicy.NormalizeTitle(value)
                If String.Equals(_title, normalized, StringComparison.Ordinal) Then Return

                _title = normalized
                StartStatusBannerRevealMotion()
                RaiseTextChanged()
                RequestSizeLayoutRefreshForSizeAffectingChange("MASStatusBanner.Title")
                InvalidateVisual()
            End Set
        End Property

        Public Property Message As String
            Get
                Return _message
            End Get
            Set(value As String)
                Dim normalized As String = MASStatusBannerVisualPolicy.NormalizeMessage(value)
                If String.Equals(_message, normalized, StringComparison.Ordinal) Then Return

                _message = normalized
                StartStatusBannerRevealMotion()
                RaiseTextChanged()
                RequestSizeLayoutRefreshForSizeAffectingChange("MASStatusBanner.Message")
                InvalidateVisual()
            End Set
        End Property

        Public Property Tone As MASToastTone
            Get
                Return _tone
            End Get
            Set(value As MASToastTone)
                Dim normalized As MASToastTone = MASStatusBannerVisualPolicy.NormalizeTone(value)
                If _tone = normalized Then Return

                _tone = normalized
                StartStatusBannerRevealMotion()
                InvalidateVisual()
            End Set
        End Property

        Public Property ShowIcon As Boolean
            Get
                Return _showIcon
            End Get
            Set(value As Boolean)
                If _showIcon = value Then Return

                _showIcon = value
                StartStatusBannerRevealMotion()
                RequestSizeLayoutRefreshForSizeAffectingChange("MASStatusBanner.ShowIcon")
                InvalidateVisual()
            End Set
        End Property

        Public Function WithTitle(value As String) As MASStatusBanner
            Title = value
            Return Me
        End Function

        Public Function WithMessage(value As String) As MASStatusBanner
            Message = value
            Return Me
        End Function

        Public Function WithTone(value As MASToastTone) As MASStatusBanner
            Tone = value
            Return Me
        End Function

        Public Function WithIcon(value As Boolean) As MASStatusBanner
            ShowIcon = value
            Return Me
        End Function

        Public Shadows Function WithSize(sizeIntent As MASSize) As MASStatusBanner
            MyBase.SetSize(sizeIntent)
            Return Me
        End Function

#End Region
    End Class

End Namespace
