Imports System.Text
Imports IntraSell_DLL
Imports IntraSell_Net_Base
Imports MySql.Data.MySqlClient

Module ModuleKueche

    Public Const Vorgang_Eigenschaft_Laufnummer = "Laufnummmer"
    Public Const VARNAME_KUECHENDISPLAY_AKTIVIERT As String = "KUECHENDISPLAY_AKTIVIERT"


    Private isVorgang As New IntraSellVorgang()


    Public Function IsKuechenDisplayAktiv() As Boolean
        Return VarValue_Default(VARNAME_KUECHENDISPLAY_AKTIVIERT, "False")
    End Function

    Public Sub InitKuechenDisplayData()
        Try
            If IsKuechenDisplayAktiv() Then
                Dim sql = $"INSERT IGNORE INTO `buchvorgangtyp` (`Typ`, `Bezeichnung`, `Druckbezeichnung`) VALUES ('{VorgangTypen.KU}', 'Kuechenauftrag', 'Kuechenauftrag');"
                RunSQL(sql)
            End If
        Catch ex As Exception
            HandleAppError(ex, Silent:=True)
        End Try
    End Sub


    Public Function GetOffeneVorgaenge() As List(Of VorgangInBearbeitung)

        Dim cmd = New MySqlCommand($"select Typ, Nummer, KundNr, Notiz from buchVorgang where Typ=@Typ and Datum>=@Datum and abgeschlossen=0 order by datum, nummer")
        cmd.Parameters.AddWithValue("Typ", VorgangTypen.KU)
        cmd.Parameters.AddWithValue("Datum", Today)
        Dim table = OpenRecordsetInMemory(cmd)

        Dim list = New List(Of VorgangInBearbeitung)

        For Each r In table.Rows
            Dim notiz As String = r("Notiz")

            'remove sonderzeichen 
            If notiz.Length > 0 Then
                notiz = CleanForLabel(notiz)
            End If

            Dim v = New VorgangInBearbeitung(r("Typ"), r("Nummer"), r("KundNr"), notiz) With {
                .Laufnummer = intrasell.vorgang.GetVorgangEigenschaft(r("Typ"), r("Nummer"), Vorgang_Eigenschaft_Laufnummer)
            }
            list.Add(v)
        Next
        Return list

    End Function


    Function CleanForLabel(notiz As String)
        Dim ind = notiz.IndexOf("Tisch")
        If ind > 0 Then
            notiz = notiz.Substring(ind)
        Else
            ind = notiz.IndexOf("Menge")
            If ind > 0 Then
                notiz = notiz.Substring(ind)
            End If
        End If
        ind = notiz.IndexOf("Brutto")
        If ind > 0 Then
            notiz = notiz.Substring(0, ind - 1)
        End If

        Dim cleaned As New StringBuilder
        For i = 0 To Len(notiz) - 1
            If Convert.ToInt16(notiz.Chars(i)) > 1 Then
                cleaned.Append(notiz.Chars(i))
            End If
        Next
        Return cleaned.ToString()
    End Function

    Sub Fertig(vorgangInBearbeitung As VorgangInBearbeitung)
        Try
            SetAbgeschlossen(vorgangInBearbeitung.Typ, vorgangInBearbeitung.Nummer)
        Catch ex As Exception
            HandleAppError(ex, Silent:=False)
        End Try
    End Sub

    Sub Druck(vorgang As VorgangInBearbeitung)
        Try
            Dim filename = vorgang.Nummer & ".pos"
            IO.File.WriteAllText(filename, vorgang.Notiz)
            PrintFile(filename, VarValue_Default(PRINT_PORT, "/d:lpt3"))
        Catch ex As Exception
            HandleAppError(ex, Silent:=False)
        End Try
    End Sub

    Sub KuechenAuftragErstellen(vorgang As VorgangInBearbeitung, auftrag As String)
        If IsKuechenDisplayAktiv() Then
            WriteLog($"OnVorgangKuecheEvent Vorgang {vorgang}")
            'WriteLog(auftrag) 'macht Probleme in Visual Studio Tests Protokoll wegen Sonderzeichen im Auftrag
            Dim woher = vorgang.Typ & vorgang.Nummer
            'Dim sqlCheck As String = "select 1 AS Cnt from buchVorgang where Typ=@Typ And Woher=@Woher"
            'Dim cmdCheck = New MySqlCommand(sqlCheck)
            'cmdCheck.Parameters.AddWithValue("Typ", VorgangTypen.KU)
            'cmdCheck.Parameters.AddWithValue("Woher", woher)
            '
            'Dim check = FirstRow(cmdCheck)
            'WriteLog($"OnVorgangKuecheEvent sqlCheck {check}")
            'If IsNumeric(check) Then
            '    If CInt(check) = 1 Then
            '        Exit Sub
            '    End If
            'End If
            'Select 
            Dim nummer = isVorgang.GetNewVorgangNummer(VorgangTypen.KU, vorgang.KundNr)

            Dim sql As String = "Insert into buchVorgang (Typ, Nummer, KundNr, Datum, Bezahlt, Ausgedruckt, Abgeschlossen, Notiz, Woher, Status) " &
        " values(@Typ, @Nummer, @KundNr, now(), 0, 0, 0, @Notiz, @Woher, 'Neu')"
            Dim cmd = New MySqlCommand(sql)
            cmd.Parameters.AddWithValue("Typ", VorgangTypen.KU)
            cmd.Parameters.AddWithValue("Nummer", nummer)
            cmd.Parameters.AddWithValue("KundNr", vorgang.KundNr)
            cmd.Parameters.AddWithValue("Notiz", auftrag)
            cmd.Parameters.AddWithValue("Woher", woher)
            RunSQL(cmd)

            isVorgang.AddVorgangEigenschaft(VorgangTypen.KU, nummer, Vorgang_Eigenschaft_Laufnummer, GetLaufnummmer())

            ModuleGlobal.RequestCommand(New IntraSellVorgangCommand() With {.Typ = VorgangTypen.KU, .Nummer = nummer, .command = IntraSellCommands.Neu})
        End If
    End Sub

    Function GetLaufnummmer()
        Dim cmd = New MySqlCommand($"select count(nummer) from buchVorgang where Typ='{VorgangTypen.KU}' and Datum>=@Datum")
        cmd.Parameters.AddWithValue("Datum", Today)
        Dim tagesnummer = FirstRow(cmd)
        If IsNumeric(tagesnummer) Then
            Return tagesnummer
        Else
            Return 1
        End If
    End Function
End Module
