Imports IntraSell_DLL
Imports IntraSell_Net_Base
Module ModulePDF

    ''' <summary>
    ''' Converts Word to PDF File
    ''' Warning: Uses the PDFCreator utility, please install first and make the settings for auto save with same filename as the doc file
    ''' </summary>
    ''' <param name="filenameWordDoc"></param>
    ''' <remarks></remarks>
    Sub SaveWordAsPDF(filenameWordDoc As String)
        Dim App As Object = Nothing  'As Application
        Try
            App = CreateObject("Word.Application")
            App.Documents.Open(fileName:=filenameWordDoc, ConfirmConversions:=False, readonly:=False, AddToRecentFiles:=False, Format:=0)

            App.ActivePrinter = "PDFCreator"
            App.Application.PrintOut(fileName:="", Range:=0, Item:=0, Copies:=1, Pages:="", PageType:=0,
                ManualDuplexPrint:=False, Collate:=True, Background:=True, PrintToFile:=
                False, PrintZoomColumn:=0, PrintZoomRow:=0, PrintZoomPaperWidth:=0,
                PrintZoomPaperHeight:=0)

            App.Quit()
        Catch e As Exception
            Dim text As String = "Ein Fehler ist aufgetretten! Diese Funktion benötigt PDFCreator und MS Word. Details: " + e.Message
            HandleAppError(e, text)
        Finally
            If App IsNot Nothing Then
                App.Quit()
            End If
        End Try
    End Sub

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="filenameWordDoc"></param>
    ''' <remarks></remarks>
    Public Sub EditInWord(filenameWordDoc As String)
        Dim App 'As Application
        App = CreateObject("Word.Application")
        App.Visible = True
        App.Documents.Open(fileName:=filenameWordDoc, ConfirmConversions:=False, readonly:=False, AddToRecentFiles:=False, Format:=0)
    End Sub


    ''' <summary>
    ''' Exportiert HTML to PDF mit Nutzung von Chrome
    ''' </summary>
    ''' <param name="filenameHTML"></param>
    ''' <returns>Dateiname der PDF Datei</returns>
    Function SaveHTMLAsPDF(filenameHTML As String, Optional silent As Boolean = True) As String
        WriteLog("SaveHTMLAsPDF " & filenameHTML)
        Dim chrome = VarValue_Default("CHROME", "c:\Program Files\Google\Chrome\Application\chrome.exe")

        If Not IO.File.Exists(chrome) Then
            MessageBox.Show("Bitte Chrome.exe Instanz auswählen:")
            Dim fd As New OpenFileDialog
            fd.FileName = chrome
            fd.ShowDialog()
            chrome = fd.FileName

            If IO.File.Exists(chrome) Then
                SetVarValue("CHROME", chrome)
            Else
                Return Nothing
            End If
        End If

        Dim document = filenameHTML '"c:\tmp\Intrasell_Net\AR_2023048_173514.html"
        Dim sourceFilename = "file:///" & document.Replace(":\", "://").Replace("\", "/")
        Dim outputFilename = document.Replace(".html", ".pdf")

        Dim command = $"{chrome} --headless=new --print-to-pdf=""{outputFilename}"" ""{sourceFilename}"""
        WriteLog("Shell " & command)
        Shell(command, AppWinStyle.NormalFocus, Wait:=True, Timeout:=3000)

        Dim i = 0
        While i < 10
            i += 1
            Threading.Thread.Sleep(1000)
            If IO.File.Exists(outputFilename) Then
                If Not silent Then
                    MessageBox.Show("Datei erfolgreich als PDF gespeichert! dateiname: " & outputFilename)
                End If
                Return outputFilename
            End If
            WriteLog("Datei noch nicht erstellt. Warte 1 Sek.. Dateiname: " & outputFilename)
        End While
        Return Nothing
    End Function


    Sub OpenFolder(folderPath As String)

        If IO.Directory.Exists(folderPath) Then

            Dim startInfo = New ProcessStartInfo
            startInfo.Arguments = folderPath
            startInfo.FileName = "explorer.exe"
            Process.Start(startInfo)
        Else

            MessageBox.Show(String.Format("{0} Directory does not exist!", folderPath))
        End If
    End Sub


    ''' <summary>
    ''' HTML Druck, Dann PDF Konvertierung, dann Mail per Drag and Drop ins Email client
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub HTMLPrint_PDF_Mail(vorgang As dsVorgaenge.buchvorgangRow)

        Dim resultFile = OpenAusdruck_InWord_Filename_RTF(vorgang.Typ, vorgang.Nummer, DEFAULT_HTML_VORLAGE_VORGANG, True)
        Dim vorgangAlsPDFDateiname = ModulePDF.SaveHTMLAsPDF(resultFile)

        If IO.File.Exists(vorgangAlsPDFDateiname) Then
            If MessageBox.Show($"Jetzt archivieren?", "Archivieren", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = DialogResult.Yes Then
                VorgangDateiArchivieren(vorgang, vorgangAlsPDFDateiname)
            End If
            If MessageBox.Show($"Jetzt senden?", "Senden", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = DialogResult.Yes Then
                Dim mail = KundenEmailVorbereiten(vorgang.Typ, vorgang.Nummer)
                mail.SofortSenden = True
                DokumentOeffnen(MAIL_GRITON, vorgangAlsPDFDateiname, mail)
            End If
        End If
    End Sub

    Public Function HTMLPrint_PDF(vorgang As dsVorgaenge.buchvorgangRow) As String
        Dim resultFile = OpenAusdruck_InWord_Filename_RTF(vorgang.Typ, vorgang.Nummer, DEFAULT_HTML_VORLAGE_VORGANG, True)
        Dim vorgangAlsPDFDateiname = ModulePDF.SaveHTMLAsPDF(resultFile)
        Return vorgangAlsPDFDateiname
    End Function

    Public Sub VorgangDateiArchivieren(vorgang As dsVorgaenge.buchvorgangRow, vorgangAlsPDFDateiname As String)
        Dim hintSpeicherplatzEinstellung = $"Mit Einstellung SPEICHERPLATZ_VORGANG_{ vorgang.Typ} können Sie einen anderen Ort festlegen."
        Dim speicherplatzFuerVorgang = SelektiereExportPath(vorgang.Typ)
        Dim destination = speicherplatzFuerVorgang & vorgang.Typ & vorgang.Nummer & " - " & ModuleKunden.KundeNamen(vorgang.KundNr) & ".pdf"
        If Not IO.File.Exists(destination) Then
            IO.File.Copy(vorgangAlsPDFDateiname, destination)
        End If
        intrasell.vorgang.AddVorgangEigenschaft(vorgang.Typ, vorgang.Nummer, "ARCHIVIERT", destination)
        ModuleDokumente.DokumentSpeichern("buchVorgang", vorgang.Typ & "-" & vorgang.Nummer, destination)
        MessageBox.Show($"Der Vorgang wurde abgelegt In {destination}. Tipp: {hintSpeicherplatzEinstellung}", "Vorgang gespeichert", MessageBoxButtons.OK, MessageBoxIcon.Information)
        OpenFolder(speicherplatzFuerVorgang)
        Process.Start("file://" & vorgangAlsPDFDateiname)
    End Sub

End Module
