Imports System.Diagnostics
Imports System.IO
Imports System.Globalization

Module Program

    Function Main() As Integer

        If My.Application.CommandLineArgs.Count = 0 Then
            Console.Error.WriteLine("FEHLER: Es wurde kein Dateipfad als Argument übergeben.")
            Return 1
        End If

        Dim inputFile As String = My.Application.CommandLineArgs(0)

        Dim wrapperDirectory As String = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName)
        Dim ffprobePath As String = Path.Combine(wrapperDirectory, "ffprobe.exe")

        If Not File.Exists(ffprobePath) Then
            Console.Error.WriteLine($"FEHLER: 'ffprobe.exe' wurde nicht unter {ffprobePath} gefunden.")
            Return 2
        End If

        Try
            Dim arguments As String = $"-v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 ""{inputFile}"""

            Using process As New Process()
                process.StartInfo.FileName = ffprobePath
                process.StartInfo.Arguments = arguments
                process.StartInfo.UseShellExecute = False
                process.StartInfo.RedirectStandardOutput = True
                process.StartInfo.RedirectStandardError = True
                process.StartInfo.CreateNoWindow = True

                process.Start()

                Dim output As String = process.StandardOutput.ReadToEnd().Trim()
                Dim errorOutput As String = process.StandardError.ReadToEnd().Trim()

                process.WaitForExit()

                If process.ExitCode <> 0 Then
                    Console.Error.WriteLine($"FEHLER: ffprobe beendete sich mit Exit Code {process.ExitCode}.")
                    Console.Error.WriteLine($"Fehlerausgabe: {errorOutput}")
                    Return 3
                End If

                Dim videoDuration As Double

                If Double.TryParse(output, NumberStyles.Float, CultureInfo.InvariantCulture, videoDuration) Then

                    Console.WriteLine(videoDuration.ToString(CultureInfo.InvariantCulture))
                    Return 0
                Else
                    Console.Error.WriteLine($"FEHLER: Konnte die Ausgabe von ffprobe nicht als Dauer interpretieren. Ausgabe: {output}")
                    Return 4
                End If

            End Using

        Catch ex As Exception
            Console.Error.WriteLine($"SYSTEMFEHLER beim Starten von ffprobe: {ex.Message}")
            Return 5
        End Try
    End Function

End Module