Imports System.Data
'Imports System.Data.OleDb
'Imports System.IOSystem.Data.SqlClient.System.Data.SqlClient.SqlConnection
Imports Parkzeit.cMeineFunktionen
'Imports System.Data.SqlClient
'Using oConn As System.Data.System.Data.SqlClient.System.Data.SqlClient.SqlConnection = New System.Data.System.Data.SqlClient.System.Data.SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings("tps_write").ConnectionString())

Public Class cDatenbank
    Public Shared Function GetNewOpenConnection() As System.Data.SqlClient.SqlConnection
        Dim conn As New System.Data.SqlClient.SqlConnection
        conn.ConnectionString = My.Resources.connectionString_PROD
        conn.Open()
        Return conn
    End Function
End Class

Public Class cOptionen

    Property OptionID As Integer
    Property Kosten_je_Stunde As Double
End Class

Public Class cOptionenDAL
    Public Function LesenOptionen() As cOptionen
        'falls ID mitgegeben, dann diese laden, ansonsten den anderen Wert suchen
        Dim sql As String = "SELECT * FROM Optionen WHERE OptionID = 0"
        Dim daten As cOptionen = Nothing

        Try
            Using conn As System.Data.SqlClient.SqlConnection = cDatenbank.GetNewOpenConnection()
                Using cmd As New System.Data.SqlClient.SqlCommand(sql, conn)
                    Dim dr = cmd.ExecuteReader()
                    If dr.HasRows Then
                        dr.Read()
                        daten = New cOptionen()
                        Try
                            daten.OptionID = 0
                            daten.Kosten_je_Stunde = VarToDbl(dr.Item("Kosten_je_Stunde"))
                        Catch ex As Exception
                            MsgBox("Fehler beim Einlesen der Optionen" & vbCrLf & vbCrLf & ex.Message, MsgBoxStyle.Exclamation)
                        End Try
                    End If
                    dr.Close()
                End Using
            End Using
            Return daten
        Catch ex As Exception
            MsgBox("Fehler beim Lesen der Optionen:" & vbCrLf & vbCrLf & ex.Message, vbExclamation, "Datenbankfehler")
            Return Nothing
        End Try
    End Function

    Public Sub SpeichernOptionen(ByVal d As cOptionen)
        Dim hAuswahl As String = ""

        'Änderung
        hAuswahl = String.Format(
                   "UPDATE Optionen SET Kosten_je_Stunde = @Kosten_je_Stunde WHERE OptionID = 0", _
                      d.Kosten_je_Stunde)
        Dim sql = hAuswahl
        Using conn As System.Data.SqlClient.SqlConnection = cDatenbank.GetNewOpenConnection()
            Using cmd As New System.Data.SqlClient.SqlCommand(sql, conn)
                cmd.Parameters.AddWithValue("@Kosten_je_Stunde", d.Kosten_je_Stunde)
                Try
                    cmd.ExecuteNonQuery()
                Catch ex As Exception
                    MsgBox("Optionen können nicht gespeichert werden!" & vbCrLf & vbCrLf & ex.Message, vbExclamation, "Fehler beim Speichern")
                End Try
            End Using
        End Using
    End Sub

End Class

Public Class cParkzeit
    Property ParkzeitID As Integer
    Property Von As Date
    Property Bis As Date
    Property Dauer As String
    Property Dauer_Minuten As Integer
    Property Kennzeichen As String
    Property Laufende_Nr As Integer
End Class

Public Class cParkzeitDruck
    'alle notwendigen Druckfelder - müssen immer String sein !
    Property ParkzeitID As String
    Property Von As String
    Property Bis As String
    Property Dauer As String
    Property Dauer_Minuten As String
    Property Kennzeichen As String
    Property Laufende_Nr As String
    Property Kosten As String
End Class

Public Class cParkzeitenDAL

    Public Function AnzeigeTabelle(hSQL As String) As DataTable
        While True  'Endlosschleife; wird verlassen durch Return oder Application.Exit()
            Try
                Dim myTable = New DataTable()
                Using conn As System.Data.SqlClient.SqlConnection = cDatenbank.GetNewOpenConnection()
                    Using cmd As New System.Data.SqlClient.SqlCommand(hSQL, conn)
                        Dim dr = cmd.ExecuteReader()
                        myTable.Load(dr)
                        dr.Close()
                    End Using
                End Using
                Return myTable  'While Schleife wird hier verlassen
            Catch ex As Exception
                Dim antwort As MsgBoxResult = MsgBox(ex.Message, CType(MsgBoxStyle.RetryCancel + MsgBoxStyle.Exclamation, MsgBoxStyle),
                                              "Problem in Function 'AnzeigeTabelle'")
                If antwort <> MsgBoxResult.Retry Then
                    'Programm wird beendet
                    MsgBox("Programm wird aufgrund eines kritischen Problems beendet.", vbInformation)
                    Environment.Exit(0)
                End If
            End Try
        End While

        Return Nothing
    End Function

    Public Function LesenParkzeit(hID As Integer, hSQL As String) As cParkzeit
        'falls ID mitgegeben, dann diese laden, ansonsten den anderen Wert suchen
        Dim sql As String
        If hID > 0 Then
            sql = "SELECT * FROM Parkzeiten WHERE ParkzeitID = " & hID
        Else
            sql = hSQL
        End If

        Dim daten As cParkzeit = Nothing
        Try
            Using conn As System.Data.SqlClient.SqlConnection = cDatenbank.GetNewOpenConnection()
                Using cmd As New System.Data.SqlClient.SqlCommand(sql, conn)
                    Dim dr = cmd.ExecuteReader()
                    If dr.HasRows Then
                        dr.Read()
                        daten = New cParkzeit()
                        daten.ParkzeitID = VarToInt(dr.Item("ParkzeitID"))
                        daten.Von = CDate(dr.Item("Von"))
                        daten.Bis = CDate(dr.Item("Bis"))
                        daten.Dauer = VarToStr(dr.Item("Dauer"))
                        daten.Dauer_Minuten = VarToInt(dr.Item("Dauer_Minuten"))
                        daten.Kennzeichen = VarToStr(dr.Item("Kennzeichen"))
                        daten.Laufende_Nr = VarToInt(dr.Item("Laufende_Nr"))
                    End If
                    dr.Close()
                End Using
            End Using
            Return daten
        Catch ex As Exception
            MsgBox("Fehler bei LesenParkzeit: " & ex.Message)
            Return Nothing
        End Try
    End Function

    Public Sub SpeichernParkzeit(ByVal d As cParkzeit)
        Dim hAuswahl As String
        If d.ParkzeitID = 0 Then
            'Neuanlage
            hAuswahl = "INSERT INTO Parkzeiten " &
                       "(Von, Bis, Dauer, Dauer_Minuten, Kennzeichen, Laufende_Nr) VALUES " &
                       "(@Von, @Bis, @Dauer, @Dauer_Minuten, @Kennzeichen, @Laufende_Nr)"
        Else
            'Änderung
            hAuswahl = String.Format(
                       "UPDATE Parkzeiten SET Von = @Von, Bis = @Bis, Dauer = @Dauer, Dauer_Minuten = @Dauer_Minuten, Kennzeichen = @Kennzeichen, Laufende_Nr = @Laufende_Nr " &
                       " WHERE ParkzeitID = @ParkzeitID", _
                          d.Von, d.Bis, d.Dauer, d.Dauer_Minuten, d.Kennzeichen, d.Laufende_Nr, d.ParkzeitID)
        End If


        Dim sql = hAuswahl
        Using conn As System.Data.SqlClient.SqlConnection = cDatenbank.GetNewOpenConnection()
            Using cmd As New System.Data.SqlClient.SqlCommand(sql, conn)
                cmd.Parameters.AddWithValue("@Von", SQLDatumZeitWithOutSemi(d.Von))
                cmd.Parameters.AddWithValue("@Bis", SQLDatumZeitWithOutSemi(d.Bis))
                cmd.Parameters.AddWithValue("@Dauer", d.Dauer)
                cmd.Parameters.AddWithValue("@Dauer_Minuten", d.Dauer_Minuten)
                cmd.Parameters.AddWithValue("@Kennzeichen", d.Kennzeichen)
                cmd.Parameters.AddWithValue("@Laufende_Nr", d.Laufende_Nr)
                If Not d.ParkzeitID = 0 Then cmd.Parameters.AddWithValue("@ParkzeitID", d.ParkzeitID)


                Try
                    cmd.ExecuteNonQuery()
                Catch ex As Exception
                    MsgBox("Datensatz kann nicht gespeichert werden!" & vbCrLf & vbCrLf & ex.Message, vbExclamation, "Fehler beim Speichern Parkzeit")
                End Try
            End Using
        End Using

    End Sub

    Public Sub LöschenParkZeit(ByVal hID As Integer)
        Dim sql As String = "DELETE FROM Parkzeiten WHERE ParkzeitID = " & hID
        Using conn As System.Data.SqlClient.SqlConnection = cDatenbank.GetNewOpenConnection()
            Using cmd As New System.Data.SqlClient.SqlCommand(sql, conn)
                Try
                    cmd.ExecuteNonQuery()
                Catch ex As Exception
                    MsgBox("Datensatz kann nicht gelöscht werden!" & vbCrLf & vbCrLf & ex.Message, vbExclamation, "Fehler beim Löschen")
                End Try
            End Using
        End Using
    End Sub

    Public Function LeseDatenFürExport(hSQL As String, hDatei As String) As Long

        Dim anz As Long
        Dim textFile As IO.StreamWriter = IO.File.CreateText(hDatei)

        'Spaltenüberschriften
        Dim x As String = "Laufende_Nr;Einfahrt;Ausfahrt;Kennzeichen;Dauer;Dauer_Minuten"
        textFile.WriteLine(x)

        Using conn As System.Data.SqlClient.SqlConnection = cDatenbank.GetNewOpenConnection()

            Using cmd As New System.Data.SqlClient.SqlCommand(hSQL, conn)
                Dim dr = cmd.ExecuteReader()
                If dr.HasRows Then
                    While dr.Read()
                        x = ""
                        x &= VarToInt(dr.Item("Laufende_Nr")).ToString & ";"
                        x &= Format(CDate(VarToDate(dr.Item("Von"))), "yyyy.MM.dd HH:mm") & ";"
                        x &= Format(CDate(VarToDate(dr.Item("Bis"))), "yyyy.MM.dd HH:mm") & ";"
                        x &= VarToStr(dr.Item("Kennzeichen")) & ";"
                        x &= VarToStr(dr.Item("Dauer")) & "h;"
                        x &= VarToInt(dr.Item("Dauer_Minuten"))
                        textFile.WriteLine(x)
                        anz += 1
                    End While
                End If
                dr.Close()
            End Using
        End Using

        textFile.Close()

        Return anz   'Anzahl retour geben
    End Function

    Public Function LeseParkzeitenFürDruck(hSQL As String, hKosten As Double) As List(Of cParkzeitDruck)
        'Dim sql As String
        'sql = "SELECT * FROM Bilanzen, Bilanzarten, Kunden WHERE (Kunden.Sachbear = 'STW' OR Kunden.Sachbear = 'GRO') AND Bilanzarten.BilanzartID = Bilanzen.BilanzartID AND Kunden.KundeID = Bilanzen.KundeID"

        'MsgBox("SQL:" & vbCrLf & hSQL)

        Dim datenListe As List(Of cParkzeitDruck) = New List(Of cParkzeitDruck)
        Dim datensatz As cParkzeitDruck

        Using conn As System.Data.SqlClient.SqlConnection = cDatenbank.GetNewOpenConnection()

            Using cmd As New System.Data.SqlClient.SqlCommand(hSQL, conn)
                Dim dr = cmd.ExecuteReader()
                If (dr.HasRows) Then
                    While dr.Read()
                        datensatz = New cParkzeitDruck()
                        datensatz.ParkzeitID = VarToInt(dr.Item("ParkzeitID")).ToString
                        datensatz.Von = Format(CDate(dr.Item("Von")), "dd.MM.yyyy HH:mm")
                        datensatz.Bis = Format(CDate(dr.Item("Bis")), "dd.MM.yyyy HH:mm")
                        datensatz.Dauer = VarToStr(dr.Item("Dauer"))
                        datensatz.Dauer_Minuten = VarToStr(dr.Item("Dauer_Minuten"))
                        datensatz.Kennzeichen = VarToStr(dr.Item("Kennzeichen"))
                        datensatz.Laufende_Nr = VarToInt(dr.Item("Laufende_Nr")).ToString
                        datensatz.Kosten = "" 'Berechnung pro Eintrag notwendig/sinnvoll?
                        datenListe.Add(datensatz)
                    End While
                End If
                dr.Close()
            End Using
        End Using


        Return datenListe
    End Function

End Class
