Option Strict On
Option Explicit On

Imports System
Imports System.Collections.Generic
Imports System.Collections.ObjectModel
Imports System.Windows.Forms
Imports Nexamas.UI.Architecture
Imports Nexamas.UI.Composition
Imports Nexamas.UI.Controls
Imports Nexamas.UI.General
Imports Nexamas.UI.Layout
Imports Nexamas.UI.Rendering
Imports Nexamas.UI.TextRendering
Imports Nexamas.UI.Theming
Imports Nexamas.UI.Values
Imports SkiaSharp

Namespace Nexamas.UI.Components

    Partial Public NotInheritable Class MASMasterDetailView

#Region "Rendering / Detail Pane"

        Private Sub DrawDetailPane(canvas As SKCanvas,
                                   ctx As MASThemeContext,
                                   rect As SKRect,
                                   dpi As Single,
                                   plan As MASMasterDetailViewLayoutPlan,
                                   accent As SKColor,
                                   isRtl As Boolean)
            If plan Is Nothing Then Return
            DrawPaneBackground(canvas, rect, dpi, plan, accent, MasterDetailViewTokens.DetailPaneFillAlpha)
            Dim body As SKRect = Inset(rect, plan.DetailPaddingPx)
            If _selectedIndex < 0 OrElse _selectedIndex >= _items.Count Then
                HideAllHostedDetailContent()
                TypographyTextPrimitives.DrawSingleLineText(canvas, ctx, ResolveDetailEmptyText(), body, dpi, MASTypography.MASTextStyle.Body, MASMasterDetailViewPolicy.ResolveMutedTextColor(ctx).WithAlpha(MasterDetailViewTokens.EmptyTextAlpha), TypographyTextPrimitives.TextAlign.Center, False)
                Return
            End If

            Dim item As MasterDetailItemState = _items(_selectedIndex)
            Dim align As TypographyTextPrimitives.TextAlign = If(isRtl, TypographyTextPrimitives.TextAlign.Right, TypographyTextPrimitives.TextAlign.Left)
            Dim cursorTop As Single = body.Top
            If plan.ShowDetailEyebrow Then
                Dim eyebrow As New SKRect(body.Left, cursorTop, body.Right, cursorTop + 22.0F * dpi * plan.ResponsiveProfile.ChromeScale)
                TypographyTextPrimitives.DrawSingleLineText(canvas, ctx, MasterDetailViewTokens.DetailEyebrowText, eyebrow, dpi, MASTypography.MASTextStyle.Micro, MASMasterDetailViewPolicy.ResolveMutedTextColor(ctx), align, False)
                cursorTop = eyebrow.Bottom + 3.0F * dpi * plan.ResponsiveProfile.GapScale
            End If

            Dim title As New SKRect(body.Left, cursorTop, body.Right, cursorTop + 36.0F * dpi * plan.ResponsiveProfile.ChromeScale)
            TypographyTextPrimitives.DrawSingleLineText(canvas, ctx, item.DetailTitle, title, dpi, MASTypography.MASTextStyle.Title, MASMasterDetailViewPolicy.ResolvePrimaryTextColor(ctx), align, False)
            cursorTop = title.Bottom + 3.0F * dpi * plan.ResponsiveProfile.GapScale

            If plan.ShowDetailSubtitle Then
                Dim subtitle As New SKRect(body.Left, cursorTop, body.Right, cursorTop + 24.0F * dpi * plan.ResponsiveProfile.ChromeScale)
                TypographyTextPrimitives.DrawSingleLineText(canvas, ctx, item.Subtitle, subtitle, dpi, MASTypography.MASTextStyle.Body, MASMasterDetailViewPolicy.ResolveMutedTextColor(ctx), align, False)
                cursorTop = subtitle.Bottom + plan.DetailGapPx
            End If

            Dim detailBottom As Single = If(plan.ShowDetailActions, body.Bottom - plan.DetailActionHeightPx, body.Bottom)
            DrawDetailTextLines(canvas, ctx, item.DetailText, New SKRect(body.Left, cursorTop, body.Right, detailBottom), dpi, plan, align)

            If plan.ShowDetailActions Then
                Dim actionTop As Single = body.Bottom - plan.DetailActionHeightPx
                Dim keyRect As New SKRect(body.Left, actionTop, body.Right, body.Bottom)
                DrawDetailActionStrip(canvas, ctx, keyRect, dpi, plan, accent, item, isRtl)
            End If

            PlaceMasterDetailHostedDetailContent(item.Key, New SKRect(body.Left, cursorTop, body.Right, detailBottom), dpi, True)
        End Sub

        Private Sub DrawSelectionConnector(canvas As SKCanvas,
                                           master As SKRect,
                                           detail As SKRect,
                                           dpi As Single,
                                           plan As MASMasterDetailViewLayoutPlan,
                                           accent As SKColor,
                                           isRtl As Boolean)
            If _selectedIndex < 0 OrElse master.IsEmpty OrElse detail.IsEmpty Then Return
            Dim y As Single = master.Top + Math.Min(master.Height * 0.5F, plan.ItemHeightPx * 0.7F)
            Dim startX As Single = If(isRtl, master.Left, master.Right)
            Dim endX As Single = If(isRtl, detail.Right, detail.Left)
            Using stroke As New SKPaint With {.IsAntialias = True, .Style = SKPaintStyle.Stroke, .StrokeWidth = Math.Max(1.0F, dpi), .Color = accent.WithAlpha(44)}
                canvas.DrawLine(startX, y, endX, y, stroke)
            End Using
        End Sub

        Private Sub DrawDetailActionStrip(canvas As SKCanvas,
                                          ctx As MASThemeContext,
                                          rect As SKRect,
                                          dpi As Single,
                                          plan As MASMasterDetailViewLayoutPlan,
                                          accent As SKColor,
                                          item As MasterDetailItemState,
                                          isRtl As Boolean)
            Dim align As TypographyTextPrimitives.TextAlign = If(isRtl, TypographyTextPrimitives.TextAlign.Right, TypographyTextPrimitives.TextAlign.Left)
            Dim keyWidth As Single = Math.Min(rect.Width * 0.55F, 250.0F * dpi * plan.ResponsiveProfile.ContentScale)
            Dim keyRect As SKRect = If(isRtl,
                                       New SKRect(rect.Right - keyWidth, rect.Top, rect.Right, rect.Bottom),
                                       New SKRect(rect.Left, rect.Top, rect.Left + keyWidth, rect.Bottom))
            TypographyTextPrimitives.DrawSingleLineText(canvas, ctx, "Key: " & item.Key, keyRect, dpi, MASTypography.MASTextStyle.Micro, MASMasterDetailViewPolicy.ResolveMutedTextColor(ctx), align, False)

            Dim actionWidth As Single = 62.0F * dpi * plan.ResponsiveProfile.ChromeScale
            Dim actionHeight As Single = Math.Min(rect.Height, 24.0F * dpi * plan.ResponsiveProfile.ChromeScale)
            Dim first As SKRect
            Dim second As SKRect
            If isRtl Then
                first = New SKRect(rect.Left, rect.MidY - actionHeight * 0.5F, rect.Left + actionWidth, rect.MidY + actionHeight * 0.5F)
                second = New SKRect(first.Right + 8.0F * dpi, first.Top, first.Right + 8.0F * dpi + actionWidth, first.Bottom)
            Else
                first = New SKRect(rect.Right - actionWidth, rect.MidY - actionHeight * 0.5F, rect.Right, rect.MidY + actionHeight * 0.5F)
                second = New SKRect(first.Left - 8.0F * dpi - actionWidth, first.Top, first.Left - 8.0F * dpi, first.Bottom)
            End If
            DrawDetailChip(canvas, ctx, first, dpi, accent, "Open")
            DrawDetailChip(canvas, ctx, second, dpi, accent, If(item.BadgeText.Length = 0, "Ready", item.BadgeText))
        End Sub

        Private Sub DrawDetailChip(canvas As SKCanvas,
                                   ctx As MASThemeContext,
                                   rect As SKRect,
                                   dpi As Single,
                                   accent As SKColor,
                                   text As String)
            If rect.Width <= 1.0F OrElse rect.Height <= 1.0F Then Return
            Using fill As New SKPaint With {.IsAntialias = True, .Style = SKPaintStyle.Fill, .Color = accent.WithAlpha(34)}
                canvas.DrawRoundRect(rect, rect.Height * 0.5F, rect.Height * 0.5F, fill)
            End Using
            TypographyTextPrimitives.DrawSingleLineText(canvas, ctx, text, rect, dpi, MASTypography.MASTextStyle.Micro, MASMasterDetailViewPolicy.ResolvePrimaryTextColor(ctx), TypographyTextPrimitives.TextAlign.Center, False)
        End Sub

        Private Sub DrawDetailTextLines(canvas As SKCanvas,
                                        ctx As MASThemeContext,
                                        text As String,
                                        rect As SKRect,
                                        dpi As Single,
                                        plan As MASMasterDetailViewLayoutPlan,
                                        align As TypographyTextPrimitives.TextAlign)
            If rect.Height <= 1.0F Then Return
            Dim safe As String = MASMasterDetailViewPolicy.NormalizeDetailText(text)
            Dim lines As List(Of String) = MASMasterDetailViewPolicy.SplitDetailLines(safe, MasterDetailViewTokens.DetailLineMaxChars, plan.MaxDetailLines)
            For i As Integer = 0 To lines.Count - 1
                Dim lineRect As New SKRect(rect.Left, rect.Top + CSng(i) * plan.DetailLineHeightPx, rect.Right, rect.Top + CSng(i + 1) * plan.DetailLineHeightPx)
                If lineRect.Top >= rect.Bottom Then Exit For
                TypographyTextPrimitives.DrawSingleLineText(canvas, ctx, lines(i), lineRect, dpi, MASTypography.MASTextStyle.Body, MASMasterDetailViewPolicy.ResolvePrimaryTextColor(ctx).WithAlpha(MasterDetailViewTokens.DetailTextAlpha), align, False)
            Next
        End Sub

#End Region

    End Class

End Namespace
