Option Strict On
Option Explicit On

Imports System
Imports System.Collections.Generic
Imports System.Globalization
Imports System.IO
Imports Nexamas.UI.Diagnostics

Namespace Nexamas.UI.Components

    ''' <summary>
    ''' Reusable Media footer metadata resolver. Media controls provide title/subtitle
    ''' and optional dimensions; this resolver derives stable title text, file extension,
    ''' existing file size, and dimension metadata without depending on ImageViewer.
    ''' </summary>
    Friend NotInheritable Class MASMediaFooterMetadataResolver
        Private Sub New()
        End Sub

        Friend Shared Function Resolve(title As String,
                                       subtitle As String,
                                       defaultTitle As String,
                                       mediaWidth As Integer,
                                       mediaHeight As Integer) As MASMediaFooterMetadata
            Dim safeTitle As String = NormalizeText(title, defaultTitle)
            Dim safeSubtitle As String = NormalizeText(subtitle, String.Empty)
            Return New MASMediaFooterMetadata(safeTitle, ResolveMetadataText(safeTitle, safeSubtitle, mediaWidth, mediaHeight))
        End Function

        Friend Shared Function NormalizeText(value As String,
                                             fallback As String) As String
            Dim text As String = If(value, String.Empty).Trim()
            If text.Length = 0 Then text = If(fallback, String.Empty)
            If text.Length > 220 Then text = text.Substring(0, 220)
            Return text
        End Function

        Private Shared Function ResolveMetadataText(title As String,
                                                    subtitle As String,
                                                    mediaWidth As Integer,
                                                    mediaHeight As Integer) As String
            If mediaWidth <= 0 OrElse mediaHeight <= 0 Then Return subtitle

            Dim parts As New List(Of String)()
            Dim formatText As String = ResolveFormatText(title, subtitle)
            Dim fileSizeText As String = ResolveFileSizeText(title, subtitle)
            Dim dimensionText As String = ResolveDimensionText(mediaWidth, mediaHeight)

            If formatText.Length > 0 Then parts.Add(formatText)
            If fileSizeText.Length > 0 Then parts.Add(fileSizeText)
            If dimensionText.Length > 0 Then parts.Add(dimensionText)

            Return String.Join("  •  ", parts.ToArray())
        End Function

        Private Shared Function ResolveDimensionText(mediaWidth As Integer,
                                                     mediaHeight As Integer) As String
            If mediaWidth <= 0 OrElse mediaHeight <= 0 Then Return String.Empty
            Return mediaWidth.ToString(CultureInfo.InvariantCulture) & " × " & mediaHeight.ToString(CultureInfo.InvariantCulture)
        End Function

        Private Shared Function ResolveFormatText(title As String,
                                                  subtitle As String) As String
            Dim extensionText As String = ResolveExtensionFromText(title)
            If extensionText.Length = 0 Then extensionText = ResolveExtensionFromText(subtitle)
            If extensionText.Length = 0 Then Return String.Empty
            Return extensionText.ToUpperInvariant()
        End Function

        Private Shared Function ResolveExtensionFromText(text As String) As String
            Dim normalized As String = NormalizeText(text, String.Empty)
            If normalized.Length = 0 Then Return String.Empty

            Try
                Dim ext As String = Path.GetExtension(normalized)
                If String.IsNullOrWhiteSpace(ext) Then Return String.Empty
                ext = ext.TrimStart("."c).Trim()
                If ext.Length = 0 Then Return String.Empty
                Return ext
            Catch masCaughtException As Exception
                Nexamas.UI.Diagnostics.MASExceptionSilencer.SwallowInputBoundary(masCaughtException, "MASMediaFooterMetadataResolver.ResolveExtensionFromText")
                Return String.Empty
            End Try
        End Function

        Private Shared Function ResolveFileSizeText(title As String,
                                                    subtitle As String) As String
            Dim filePath As String = ResolveExistingPath(title, subtitle)
            If filePath.Length = 0 Then Return String.Empty

            Try
                Dim info As New FileInfo(filePath)
                If Not info.Exists Then Return String.Empty
                Return FormatFileSize(info.Length)
            Catch masCaughtException As Exception
                Nexamas.UI.Diagnostics.MASExceptionSilencer.SwallowInputBoundary(masCaughtException, "MASMediaFooterMetadataResolver.ResolveFileSizeText")
                Return String.Empty
            End Try
        End Function

        Private Shared Function ResolveExistingPath(title As String,
                                                    subtitle As String) As String
            If IsExistingFilePath(subtitle) Then Return subtitle
            If IsExistingFilePath(title) Then Return title
            Return String.Empty
        End Function

        Private Shared Function IsExistingFilePath(pathCandidate As String) As Boolean
            If String.IsNullOrWhiteSpace(pathCandidate) Then Return False
            Try
                Return File.Exists(pathCandidate)
            Catch masCaughtException As Exception
                Nexamas.UI.Diagnostics.MASExceptionSilencer.SwallowInputBoundary(masCaughtException, "MASMediaFooterMetadataResolver.IsExistingFilePath")
                Return False
            End Try
        End Function

        Private Shared Function FormatFileSize(byteCount As Long) As String
            If byteCount < 0L Then Return String.Empty
            Const kilo As Double = 1024.0R
            Const mega As Double = kilo * 1024.0R
            Const giga As Double = mega * 1024.0R

            If byteCount >= CLng(giga) Then Return (CDbl(byteCount) / giga).ToString("0.#", CultureInfo.InvariantCulture) & " GB"
            If byteCount >= CLng(mega) Then Return (CDbl(byteCount) / mega).ToString("0.#", CultureInfo.InvariantCulture) & " MB"
            If byteCount >= CLng(kilo) Then Return (CDbl(byteCount) / kilo).ToString("0.#", CultureInfo.InvariantCulture) & " KB"
            Return byteCount.ToString(CultureInfo.InvariantCulture) & " B"
        End Function
    End Class

End Namespace
