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 "View State"

        Private Sub MoveBy(delta As Integer)
            If _items.Count <= 0 Then Return
            SetSelectedIndex(MASMasterDetailViewPolicy.ClampIndex(_selectedIndex + delta, _items.Count), True)
        End Sub

        Private Function HasScrollableMasterViewport() As Boolean
            Return _items.Count > Math.Max(0, _lastVisibleCount)
        End Function

        Private Function ResolveMasterViewportMaxTop() As Integer
            Return Math.Max(0, _items.Count - Math.Max(1, _lastVisibleCount))
        End Function

        Private Function CanScrollMasterViewport(delta As Integer) As Boolean
            If Not HasScrollableMasterViewport() Then Return False
            Dim maxTop As Integer = ResolveMasterViewportMaxTop()
            If delta < 0 Then Return _topIndex < maxTop
            If delta > 0 Then Return _topIndex > 0
            Return False
        End Function

        Private Sub SetSelectedIndex(index As Integer,
                                     shouldRaiseSelectionEvent As Boolean)
            Dim normalized As Integer = MASMasterDetailViewPolicy.ClampIndex(index, _items.Count)
            If normalized < 0 Then
                StopSelectionMotion()
                _selectedIndex = -1
                Return
            End If
            Dim previous As Integer = _selectedIndex
            Dim changed As Boolean = normalized <> _selectedIndex
            _selectedIndex = normalized
            _topIndex = MASMasterDetailViewPolicy.EnsureVisibleIndex(_selectedIndex, _topIndex, _items.Count, _lastVisibleCount)
            If changed Then StartSelectionMotion(previous, normalized)
            InvalidateVisual()
            If changed AndAlso shouldRaiseSelectionEvent Then RaiseSelectedItemChangedSafe()
        End Sub

        Private Sub NormalizeViewState()
            If _items.Count = 0 Then
                StopSelectionMotion()
                _selectedIndex = -1
                _topIndex = 0
                Return
            End If
            _selectedIndex = MASMasterDetailViewPolicy.ClampIndex(_selectedIndex, _items.Count)
            _topIndex = MASMasterDetailViewPolicy.EnsureVisibleIndex(_selectedIndex, _topIndex, _items.Count, _lastVisibleCount)
        End Sub

        Private Function FindItemIndex(itemKey As String) As Integer
            Dim normalized As String = MASMasterDetailViewPolicy.NormalizeKey(itemKey, "item", 1)
            For i As Integer = 0 To _items.Count - 1
                If String.Equals(_items(i).Key, normalized, StringComparison.Ordinal) Then Return i
            Next
            Return -1
        End Function

#End Region

    End Class

End Namespace
