Option Strict On
Option Explicit On

Imports System
Imports SkiaSharp

Namespace Nexamas.UI.Theming

    ''' <summary>
    ''' Immutable implementation of neutral surface, border, and metallic color tokens.
    ''' </summary>
    <Global.System.ComponentModel.EditorBrowsable(Global.System.ComponentModel.EditorBrowsableState.Advanced)>
    Friend NotInheritable Class NeutralTheme
        Implements IMASNeutralTheme

        Private ReadOnly _surface0 As SKColor
        Private ReadOnly _surface1 As SKColor
        Private ReadOnly _surface2 As SKColor
        Private ReadOnly _surface3 As SKColor

        Private ReadOnly _borderSubtle As SKColor
        Private ReadOnly _borderDefault As SKColor
        Private ReadOnly _borderStrong As SKColor

        Private ReadOnly _metallicSoft As SKColor
        Private ReadOnly _metallicEdge As SKColor

        Friend Sub New(surface0 As SKColor,
                       surface1 As SKColor,
                       surface2 As SKColor,
                       surface3 As SKColor,
                       borderSubtle As SKColor,
                       borderDefault As SKColor,
                       borderStrong As SKColor,
                       metallicSoft As SKColor,
                       metallicEdge As SKColor)

            ValidateRequiredColor(surface0, NameOf(surface0))
            ValidateRequiredColor(surface1, NameOf(surface1))
            ValidateRequiredColor(surface2, NameOf(surface2))
            ValidateRequiredColor(surface3, NameOf(surface3))
            ValidateRequiredColor(borderSubtle, NameOf(borderSubtle))
            ValidateRequiredColor(borderDefault, NameOf(borderDefault))
            ValidateRequiredColor(borderStrong, NameOf(borderStrong))
            ValidateRequiredColor(metallicSoft, NameOf(metallicSoft))
            ValidateRequiredColor(metallicEdge, NameOf(metallicEdge))

            _surface0 = surface0
            _surface1 = surface1
            _surface2 = surface2
            _surface3 = surface3

            _borderSubtle = borderSubtle
            _borderDefault = borderDefault
            _borderStrong = borderStrong

            _metallicSoft = metallicSoft
            _metallicEdge = metallicEdge
        End Sub

        Public ReadOnly Property Surface0 As SKColor Implements IMASNeutralTheme.Surface0
            Get
                Return _surface0
            End Get
        End Property

        Public ReadOnly Property Surface1 As SKColor Implements IMASNeutralTheme.Surface1
            Get
                Return _surface1
            End Get
        End Property

        Public ReadOnly Property Surface2 As SKColor Implements IMASNeutralTheme.Surface2
            Get
                Return _surface2
            End Get
        End Property

        Public ReadOnly Property Surface3 As SKColor Implements IMASNeutralTheme.Surface3
            Get
                Return _surface3
            End Get
        End Property

        Public ReadOnly Property BorderSubtle As SKColor Implements IMASNeutralTheme.BorderSubtle
            Get
                Return _borderSubtle
            End Get
        End Property

        Public ReadOnly Property BorderDefault As SKColor Implements IMASNeutralTheme.BorderDefault
            Get
                Return _borderDefault
            End Get
        End Property

        Public ReadOnly Property BorderStrong As SKColor Implements IMASNeutralTheme.BorderStrong
            Get
                Return _borderStrong
            End Get
        End Property

        Public ReadOnly Property MetallicSoft As SKColor Implements IMASNeutralTheme.MetallicSoft
            Get
                Return _metallicSoft
            End Get
        End Property

        Public ReadOnly Property MetallicEdge As SKColor Implements IMASNeutralTheme.MetallicEdge
            Get
                Return _metallicEdge
            End Get
        End Property

        Private Shared Sub ValidateRequiredColor(color As SKColor, paramName As String)
            If color.Alpha = 0 AndAlso color.Red = 0 AndAlso color.Green = 0 AndAlso color.Blue = 0 Then
                Throw New ArgumentException("Color cannot be empty or fully transparent black.", paramName)
            End If
        End Sub

    End Class

End Namespace