Imports Microsoft.VisualBasic
Imports System.Data

Public Class Cart
    Private Shared _dSet As DataSet
    Private Shared view As DataView

    Public Shared Sub TestData()
        Dim dProductsTable As New DataTable("Products")
        Dim dOrdersTable As New DataTable("Orders")
        Dim dRow As DataRow
        Dim key As Int32

        ' Clear everything so we don't duplicate
        ' the dummy rows again
        '
        If Not _dSet Is Nothing Then
            _dSet.Dispose()
            _dSet = Nothing
        End If
        _dSet = New DataSet

        dProductsTable.Columns.Add("ProductId", Type.GetType("System.Int32"))
        dProductsTable.Columns("ProductId").AutoIncrement = True
        dProductsTable.Columns("ProductId").AllowDBNull = False
        dProductsTable.Columns("ProductId").Unique = True
        dProductsTable.PrimaryKey = New DataColumn() {dProductsTable.Columns("ProductId")}
        dProductsTable.Columns.Add("Name", Type.GetType("System.String"))
        dProductsTable.Columns.Add("Price", Type.GetType("System.Double"))
        dProductsTable.Columns.Add("Description", Type.GetType("System.String"))
        _dSet.Tables.Add(dProductsTable)

        dOrdersTable.Columns.Add("Id", Type.GetType("System.Int32"))
        dOrdersTable.Columns("Id").AutoIncrement = True
        dOrdersTable.Columns("Id").AllowDBNull = False
        dOrdersTable.Columns("Id").Unique = True
        dOrdersTable.PrimaryKey = New DataColumn() {dOrdersTable.Columns("Id")}
        dOrdersTable.Columns.Add("ProductId", Type.GetType("System.Int32"))
        dOrdersTable.Columns.Add("Quantity", Type.GetType("System.Int32"))
        _dSet.Tables.Add(dOrdersTable)

        ' Setup a relationship between the primary and foreign key.
        ' The parent table contains the primary key.
        '
        _dSet.Relations.Add("CartRelation", dProductsTable.Columns("ProductId"), dOrdersTable.Columns("ProductId"))

        dRow = dProductsTable.NewRow()
        dRow("Name") = "Mouse"
        dRow("Price") = 10.49
        dRow("Description") = "Computer mouse"
        dProductsTable.Rows.Add(dRow)
        key = dRow("ProductId")

        dRow = dOrdersTable.NewRow()
        dRow("ProductId") = key
        dRow("Quantity") = 10
        dOrdersTable.Rows.Add(dRow)

        dRow = dProductsTable.NewRow()
        dRow("Name") = "Case"
        dRow("Price") = 60.7
        dRow("Description") = "Computer case"
        dProductsTable.Rows.Add(dRow)
        key = dRow("ProductId")

        dRow = dOrdersTable.NewRow()
        dRow("ProductId") = key
        dRow("Quantity") = 1
        dOrdersTable.Rows.Add(dRow)

        dProductsTable.AcceptChanges()
        dOrdersTable.AcceptChanges()
    End Sub

    Public Function SelectCart() As DataView
        Dim dCartTable As New DataTable("Cart")
        Dim dOrderRow As DataRow
        Dim dProductRow As DataRow
        Dim dRow As DataRow

        dCartTable.Columns.Add("Id", Type.GetType("System.Int32"))
        dCartTable.Columns.Add("Name", Type.GetType("System.String"))
        dCartTable.Columns.Add("Price", Type.GetType("System.Double"))
        dCartTable.Columns.Add("Description", Type.GetType("System.String"))
        dCartTable.Columns.Add("Quantity", Type.GetType("System.Int32"))
        dCartTable.Columns.Add("RowState", Type.GetType("System.Int32"))

        For Each dProductRow In _dSet.Tables("Products").Rows
            Dim dJoinedOrderRows() As DataRow = dProductRow.GetChildRows("CartRelation")
            For Each dOrderRow In dJoinedOrderRows
                dRow = dCartTable.NewRow
                dRow("Id") = dOrderRow("Id")
                dRow("Name") = dProductRow("Name")
                dRow("Price") = dProductRow("Price")
                dRow("Description") = dProductRow("Description")
                dRow("Quantity") = dOrderRow("Quantity")
                If (dOrderRow.RowState And DataRowState.Unchanged) = DataRowState.Unchanged Then
                    dRow("RowState") = 0
                Else
                    dRow("RowState") = 1
                End If
                dCartTable.Rows.Add(dRow)
            Next
        Next

        view = dCartTable.DefaultView

        Return view
    End Function

    Public Sub EditItem(ByVal Id As Integer, ByVal Quantity As Integer)
        Dim dOrdersTable As DataTable
        Dim dRow As DataRow

        dOrdersTable = _dSet.Tables("Orders")

        dRow = dOrdersTable.Rows.Find(Id)
        dRow("Quantity") = Quantity
    End Sub

    Public Sub AcceptChanges()
        _dSet.Tables("Orders").AcceptChanges()
    End Sub

    Public Sub RejectChanges()
        _dSet.Tables("Orders").RejectChanges()
    End Sub

    Public Sub Sort(ByVal sortExpression As String, ByVal dir As SortDirection)
        Dim dirStr As String = ""

        If dir = SortDirection.Descending Then
            dirStr = "DESC"
        End If

        view.Sort = sortExpression & " " & dirStr

    End Sub

End Class
