Option Strict On
Option Explicit On

Imports System
Imports System.Collections.Generic
Imports System.Globalization
Imports Nexamas.UI.Theming
Imports Nexamas.UI.Values
Imports SkiaSharp

Namespace Nexamas.UI.Components

    ''' <summary>
    ''' Friend-owned policy for MASKanbanBoard. It centralizes text hygiene,
    ''' identifier hygiene, selection clamping, visible-column/card windows, RTL
    ''' direction, theme color resolution, and architectural boundary facts.
    ''' </summary>
    Friend NotInheritable Class MASKanbanBoardPolicy
        Private Sub New()
        End Sub

        Friend Shared Function NormalizeTitle(value As String) As String
            Dim normalized As String = NormalizeText(value, KanbanBoardTokens.DefaultTitle, 96)
            If normalized.Length = 0 Then Return KanbanBoardTokens.DefaultTitle
            Return normalized
        End Function

        Friend Shared Function NormalizeColumnTitle(value As String) As String
            Return NormalizeText(value, KanbanBoardTokens.DefaultColumnTitle, 72)
        End Function

        Friend Shared Function NormalizeCardTitle(value As String) As String
            Return NormalizeText(value, KanbanBoardTokens.DefaultCardTitle, 96)
        End Function

        Friend Shared Function NormalizeCardDetail(value As String) As String
            Return NormalizeText(value, String.Empty, 128)
        End Function

        Friend Shared Function NormalizeBadgeText(value As String) As String
            Return NormalizeText(value, String.Empty, 24)
        End Function

        Friend Shared Function NormalizeKey(value As String,
                                            fallbackPrefix As String,
                                            fallbackIndex As Integer) As String
            Dim normalized As String = If(value, String.Empty).Trim()
            If normalized.Length = 0 Then normalized = fallbackPrefix & Math.Max(1, fallbackIndex).ToString(CultureInfo.InvariantCulture)
            If normalized.Length > 64 Then normalized = normalized.Substring(0, 64)
            Return normalized
        End Function

        Friend Shared Function NormalizeText(value As String,
                                             fallback As String,
                                             maxLength As Integer) As String
            Dim normalized As String = If(value, String.Empty).Trim()
            If normalized.Length = 0 Then normalized = If(fallback, String.Empty)
            normalized = normalized.Replace(ControlChars.Cr, " "c).Replace(ControlChars.Lf, " "c).Replace(ControlChars.Tab, " "c)
            While normalized.Contains("  ")
                normalized = normalized.Replace("  ", " ")
            End While
            If maxLength > 0 AndAlso normalized.Length > maxLength Then normalized = normalized.Substring(0, maxLength)
            Return normalized
        End Function

        Friend Shared Function ClampIndex(index As Integer,
                                          count As Integer) As Integer
            If count <= 0 Then Return -1
            If index < 0 Then Return 0
            If index >= count Then Return count - 1
            Return index
        End Function

        Friend Shared Function EnsureVisibleColumnIndex(selectedIndex As Integer,
                                                        currentLeftIndex As Integer,
                                                        columnCount As Integer) As Integer
            If columnCount <= 0 Then Return 0
            Dim maxLeft As Integer = Math.Max(0, columnCount - KanbanBoardTokens.MaxVisibleColumns)
            Dim left As Integer = Math.Max(0, Math.Min(currentLeftIndex, maxLeft))
            If selectedIndex < 0 Then Return left
            If selectedIndex < left Then Return Math.Max(0, selectedIndex)
            If selectedIndex >= left + KanbanBoardTokens.MaxVisibleColumns Then
                Return Math.Max(0, Math.Min(maxLeft, selectedIndex - KanbanBoardTokens.MaxVisibleColumns + 1))
            End If
            Return left
        End Function

        Friend Shared Function EnsureVisibleCardIndex(selectedIndex As Integer,
                                                      currentTopIndex As Integer,
                                                      cardCount As Integer) As Integer
            If cardCount <= 0 Then Return 0
            Dim maxTop As Integer = Math.Max(0, cardCount - KanbanBoardTokens.MaxVisibleCardsPerColumn)
            Dim top As Integer = Math.Max(0, Math.Min(currentTopIndex, maxTop))
            If selectedIndex < 0 Then Return top
            If selectedIndex < top Then Return Math.Max(0, selectedIndex)
            If selectedIndex >= top + KanbanBoardTokens.MaxVisibleCardsPerColumn Then
                Return Math.Max(0, Math.Min(maxTop, selectedIndex - KanbanBoardTokens.MaxVisibleCardsPerColumn + 1))
            End If
            Return top
        End Function

        Friend Shared Function ResolveRightToLeft() As Boolean
            Try
                Return Nexamas.UI.Localization.MASLocalization.IsCurrentRightToLeft()
            Catch ex As Exception
                Nexamas.UI.Diagnostics.MASExceptionSilencer.SwallowInputBoundary(ex, "MASKanbanBoardPolicy.ResolveRightToLeft")
                Return False
            End Try
        End Function

        Friend Shared Function BuildSummary(columnCount As Integer,
                                            cardCount As Integer) As String
            Dim columnsText As String = If(columnCount = 1, "1 column", columnCount.ToString(CultureInfo.CurrentCulture) & " columns")
            Dim cardsText As String = If(cardCount = 1, "1 card", cardCount.ToString(CultureInfo.CurrentCulture) & " cards")
            Return columnsText & " • " & cardsText
        End Function

        Friend Shared Function ResolveAccentColor(ctx As MASThemeContext) As SKColor
            If ctx IsNot Nothing AndAlso ctx.BrandTheme IsNot Nothing Then Return ctx.BrandTheme.BrandPrimary
            If ctx IsNot Nothing AndAlso ctx.SemanticTheme IsNot Nothing Then Return ctx.SemanticTheme.Info
            Return New SKColor(64, 132, 246)
        End Function

        Friend Shared Function ResolvePrimaryTextColor(ctx As MASThemeContext) As SKColor
            If ctx IsNot Nothing AndAlso ctx.TextColorTheme IsNot Nothing Then Return ctx.TextColorTheme.PrimaryText.WithAlpha(KanbanBoardTokens.TextAlpha)
            Return Nexamas.UI.Values.Color.Text.Primary.WithAlpha(KanbanBoardTokens.TextAlpha)
        End Function

        Friend Shared Function ResolveMutedTextColor(ctx As MASThemeContext) As SKColor
            If ctx IsNot Nothing AndAlso ctx.TextColorTheme IsNot Nothing Then Return ctx.TextColorTheme.SecondaryText.WithAlpha(KanbanBoardTokens.MutedTextAlpha)
            Return Nexamas.UI.Values.Color.Text.Secondary.WithAlpha(KanbanBoardTokens.MutedTextAlpha)
        End Function

        Friend Shared Function HasNoTaskPersistencePath() As Boolean
            Return True
        End Function

        Friend Shared Function HasNoWorkflowEnginePath() As Boolean
            Return True
        End Function

        Friend Shared Function HasNoRemoteProviderPath() As Boolean
            Return True
        End Function

        Friend Shared Function HasNoOsDragDropRuntimePath() As Boolean
            Return True
        End Function

        Friend Shared Function HasNoBackgroundSyncPath() As Boolean
            Return True
        End Function

        Friend Shared Function HasNoDataGridOrListViewWrapperPath() As Boolean
            Return True
        End Function

        Friend Shared Function HasMouseFocusRingSuppressed() As Boolean
            Return True
        End Function

        Friend Shared Function HasDataSourceProjectionPath() As Boolean
            Return True
        End Function

        Friend Shared Function HasBoardSnapshotPersistencePath() As Boolean
            Return True
        End Function

        Friend Shared Function HasCardReorderPath() As Boolean
            Return True
        End Function


        Friend Shared Function HasWipDropRuleContractPath() As Boolean
            Return KanbanBoardTokens.MaxColumns > 1 AndAlso
                   KanbanBoardTokens.MaxCards >= KanbanBoardTokens.MaxVisibleColumns * KanbanBoardTokens.MaxVisibleCardsPerColumn AndAlso
                   KanbanBoardTokens.DragStartThresholdDip > 0.0F AndAlso
                   KanbanBoardTokens.DragAutoScrollZoneDip > 0.0F
        End Function

        Friend Shared Function HasIntentionalDetachWriteBackPolicyPath() As Boolean
            Return HasDataSourceProjectionPath() AndAlso HasCardReorderPath() AndAlso HasNoRemoteProviderPath() AndAlso HasNoBackgroundSyncPath()
        End Function

        Friend Shared Function HasLargeBoardWindowingProofPath() As Boolean
            Return KanbanBoardTokens.MaxProjectedSourceCards >= KanbanBoardTokens.LargeBoardProofCards AndAlso
                   KanbanBoardTokens.LargeBoardProofColumns <= KanbanBoardTokens.MaxColumns AndAlso
                   KanbanBoardTokens.MaxVisibleColumns < KanbanBoardTokens.LargeBoardProofColumns AndAlso
                   KanbanBoardTokens.MaxVisibleCardsPerColumn < KanbanBoardTokens.LargeBoardProofCardsPerColumn
        End Function
    End Class

End Namespace
