Option Strict On
Option Explicit On

Imports System

Namespace Nexamas.UI.Composition

    ''' <summary>
    ''' Developer-facing diagnostic emitted by Build/Measure/Arrange/Apply.
    ''' It owns diagnostic data only and never mutates layout or controls.
    ''' </summary>
    <Global.System.ComponentModel.EditorBrowsable(Global.System.ComponentModel.EditorBrowsableState.Advanced)>
    Friend NotInheritable Class MASLayoutDiagnostic

        Public ReadOnly Property Severity As MASLayoutDiagnosticSeverity
        Public ReadOnly Property Code As String
        Public ReadOnly Property Message As String
        Public ReadOnly Property Detail As String

        Friend Sub New(severity As MASLayoutDiagnosticSeverity,
                       code As String,
                       message As String,
                       Optional detail As String = "")

            Me.Severity = severity
            Me.Code = If(code, "MASLayout.Unknown")
            Me.Message = If(message, "")
            Me.Detail = If(detail, "")
        End Sub

        Public Shared Function [Error](code As String, message As String, Optional detail As String = "") As MASLayoutDiagnostic
            Return New MASLayoutDiagnostic(MASLayoutDiagnosticSeverity.Error, code, message, detail)
        End Function

        Public Shared Function Warning(code As String, message As String, Optional detail As String = "") As MASLayoutDiagnostic
            Return New MASLayoutDiagnostic(MASLayoutDiagnosticSeverity.Warning, code, message, detail)
        End Function

        Public Overrides Function ToString() As String
            If String.IsNullOrWhiteSpace(Detail) Then
                Return Severity.ToString() & ": " & Code & " - " & Message
            End If

            Return Severity.ToString() & ": " & Code & " - " & Message & " " & Detail
        End Function

    End Class

End Namespace
