﻿Option Strict On
Option Explicit On

Imports System
Imports System.Collections.Generic
Imports System.Globalization

Partial Friend NotInheritable Class ShowcaseNavigationCatalog

    Friend Shared Function GetExecutiveTourEntries() As IReadOnlyList(Of ShowcaseNavigationEntry)
        Dim executiveJourney As ShowcaseProductJourney = FindProductJourneyById("executive")
        If executiveJourney Is Nothing Then
            Return New List(Of ShowcaseNavigationEntry)().AsReadOnly()
        End If

        Return GetJourneyEntries(executiveJourney)
    End Function

    Friend Shared Function GetFirstExecutiveTourEntry() As ShowcaseNavigationEntry
        Dim entries As IReadOnlyList(Of ShowcaseNavigationEntry) = GetExecutiveTourEntries()
        If entries.Count = 0 Then Return Nothing
        Return entries(0)
    End Function

    Friend Shared Function GetFirstEntry(category As ShowcaseNavigationCategory) As ShowcaseNavigationEntry
        Dim entries As IReadOnlyList(Of ShowcaseNavigationEntry) = GetEntries(category)
        If entries.Count = 0 Then Return Nothing
        Return entries(0)
    End Function

    Friend Shared Function GetPreviousEntry(entry As ShowcaseNavigationEntry) As ShowcaseNavigationEntry
        Return ResolveNeighborEntry(entry, -1)
    End Function

    Friend Shared Function GetNextEntry(entry As ShowcaseNavigationEntry) As ShowcaseNavigationEntry
        Return ResolveNeighborEntry(entry, 1)
    End Function

    Friend Shared Function GetRelatedEntries(entry As ShowcaseNavigationEntry,
                                             Optional maximumCount As Integer = 3) As IReadOnlyList(Of ShowcaseNavigationEntry)
        Dim result As New List(Of ShowcaseNavigationEntry)()
        If entry Is Nothing OrElse maximumCount <= 0 Then Return result.AsReadOnly()

        For Each candidate As ShowcaseNavigationEntry In GetEntries(entry.Category)
            If candidate IsNot Nothing AndAlso Not String.Equals(candidate.Id, entry.Id, StringComparison.OrdinalIgnoreCase) Then
                result.Add(candidate)
                If result.Count >= maximumCount Then Exit For
            End If
        Next

        Return result.AsReadOnly()
    End Function

    Friend Shared Function ResolveTourPositionText(entry As ShowcaseNavigationEntry) As String
        If entry Is Nothing Then Return "Capability"

        Dim entries As IReadOnlyList(Of ShowcaseNavigationEntry) = GetEntries(entry.Category)
        For index As Integer = 0 To entries.Count - 1
            If entries(index) IsNot Nothing AndAlso String.Equals(entries(index).Id, entry.Id, StringComparison.OrdinalIgnoreCase) Then
                Return (index + 1).ToString(CultureInfo.InvariantCulture) & " of " & entries.Count.ToString(CultureInfo.InvariantCulture)
            End If
        Next

        Return "Capability"
    End Function

    Private Shared Function ResolveNeighborEntry(entry As ShowcaseNavigationEntry,
                                                 offset As Integer) As ShowcaseNavigationEntry
        If entry Is Nothing OrElse offset = 0 Then Return Nothing

        Dim entries As IReadOnlyList(Of ShowcaseNavigationEntry) = GetEntries(entry.Category)
        For index As Integer = 0 To entries.Count - 1
            If entries(index) IsNot Nothing AndAlso String.Equals(entries(index).Id, entry.Id, StringComparison.OrdinalIgnoreCase) Then
                Dim targetIndex As Integer = index + offset
                If targetIndex < 0 OrElse targetIndex >= entries.Count Then Return Nothing
                Return entries(targetIndex)
            End If
        Next

        Return Nothing
    End Function
End Class
