Option Strict On
Option Explicit On

Imports System
Imports System.Linq

Namespace Nexamas.UI.Visualization

    ''' <summary>
    ''' Immutable render-plan facts for one chart definition.
    ''' </summary>
    Friend NotInheritable Class MASChartRenderPlan

        Private ReadOnly _primitives As MASChartVisualPrimitive()

        Friend Sub New(definition As MASChartDefinition,
                       viewport As MASChartViewport,
                       primitives As MASChartVisualPrimitive(),
                       status As MASChartFoundationStatus,
                       message As String)
            Me.Definition = definition
            Me.Viewport = viewport
            _primitives = If(primitives, New MASChartVisualPrimitive() {}).Where(Function(primitive) primitive IsNot Nothing).ToArray()
            Me.Status = status
            Me.Message = MASChartDataPoint.NormalizeText(message)
        End Sub

        Friend ReadOnly Property Definition As MASChartDefinition
        Friend ReadOnly Property Viewport As MASChartViewport
        Friend ReadOnly Property Status As MASChartFoundationStatus
        Friend ReadOnly Property Message As String

        Friend ReadOnly Property Primitives As MASChartVisualPrimitive()
            Get
                Return DirectCast(_primitives.Clone(), MASChartVisualPrimitive())
            End Get
        End Property

        Friend ReadOnly Property ChartKind As MASChartKind
            Get
                If Definition Is Nothing Then Return MASChartKind.Unknown
                Return Definition.Kind
            End Get
        End Property

        Friend ReadOnly Property PrimitiveCount As Integer
            Get
                Return _primitives.Length
            End Get
        End Property

        Friend ReadOnly Property ReadyForDashboardChart As Boolean
            Get
                Return Status = MASChartFoundationStatus.Ready AndAlso PrimitiveCount > 0 AndAlso _primitives.All(Function(primitive) primitive.IsValid)
            End Get
        End Property

        Friend ReadOnly Property HasLinePrimitive As Boolean
            Get
                Return _primitives.Any(Function(primitive) primitive.Kind = MASChartVisualPrimitiveKind.LineSegment OrElse primitive.Kind = MASChartVisualPrimitiveKind.LinePoint)
            End Get
        End Property

        Friend ReadOnly Property HasBarPrimitive As Boolean
            Get
                Return _primitives.Any(Function(primitive) primitive.Kind = MASChartVisualPrimitiveKind.Bar)
            End Get
        End Property

        Friend ReadOnly Property HasPiePrimitive As Boolean
            Get
                Return _primitives.Any(Function(primitive) primitive.Kind = MASChartVisualPrimitiveKind.PieSlice)
            End Get
        End Property

        Friend ReadOnly Property HasDonutPrimitive As Boolean
            Get
                Return _primitives.Any(Function(primitive) primitive.Kind = MASChartVisualPrimitiveKind.DonutSlice)
            End Get
        End Property

        Friend ReadOnly Property HasKpiPrimitive As Boolean
            Get
                Return _primitives.Any(Function(primitive) primitive.Kind = MASChartVisualPrimitiveKind.KpiValue)
            End Get
        End Property

        Friend ReadOnly Property HasSparklinePrimitive As Boolean
            Get
                Return _primitives.Any(Function(primitive) primitive.Kind = MASChartVisualPrimitiveKind.SparklineSegment OrElse primitive.Kind = MASChartVisualPrimitiveKind.SparklinePoint)
            End Get
        End Property

        Friend Shared Function Failed(definition As MASChartDefinition,
                                      viewport As MASChartViewport,
                                      status As MASChartFoundationStatus,
                                      message As String) As MASChartRenderPlan
            Return New MASChartRenderPlan(definition, viewport, New MASChartVisualPrimitive() {}, status, message)
        End Function

    End Class

End Namespace
