Imports XCCLibrary

Public Class GUI
    Dim filesFolder As String = "C:\Users\Anton\Documents\Exjobb"
    Dim HLCtFolder As String = "C:\Users\Anton\Documents\Exjobb\X2021"

    Dim containerPanel As Panel
    Dim containerX, containerY, containerW, containerH, containerMidX, containerMidY As Integer
    Dim gratingMaxL As Decimal = 1200
    Dim gratingMaxW As Decimal = 1200
    Dim drawW As Integer = 1
    Dim drawH As Integer = 1
    Dim drawAspect, gratingAspect As Decimal
    Dim scaleDiff As Decimal = 1

    Public pCon1(3) As Decimal 'pCon(0) = pixel X, pCon(2) = SW X, etc.
    Public pCon2(3) As Decimal
    Public pCon3(3) As Decimal
    Public pCon4(3) As Decimal

    Dim points As New Dictionary(Of String, Decimal())
    Dim pointsOrder As New List(Of String)

    Dim PointButtons As New List(Of Button)

    Dim angleCounter As Integer

    ' --- Start method when GUI loads ---
    Sub GUI_load() Handles MyBase.Load
        containerPanel = DrawingPanel
        AddHandler containerPanel.Paint, AddressOf DrawingPanel_Paint

        Get_DrawboxParameters()

        Set_ContainerPointsX()
        Set_ContainerPointsY()

        Update_GratingDimensions()

        Create_StartPoints()

        Program.Load_XCC(filesFolder, HLCtFolder)
    End Sub

    ' --- Retrive parameters for the drawing box ---
    Private Sub Get_DrawboxParameters()
        containerX = containerPanel.Location.X   'Behövs ej nu
        containerY = containerPanel.Location.Y   'Behövs ej nu

        containerW = containerPanel.Size.Width
        containerH = containerPanel.Size.Height

        containerMidX = containerW / 2
        containerMidY = containerH / 2

        drawW = containerW - 60
        drawH = containerH - 60

        drawAspect = drawW / drawH
    End Sub

    ' --- Set containers points X-values ---
    Private Sub Set_ContainerPointsX()
        pCon1(0) = containerMidX - drawW / 2
        pCon2(0) = containerMidX + drawW / 2
        pCon3(0) = containerMidX + drawW / 2
        pCon4(0) = containerMidX - drawW / 2
    End Sub

    ' --- Set containers points Y-values ---
    Private Sub Set_ContainerPointsY()
        pCon1(1) = containerMidY - drawH / 2
        pCon2(1) = containerMidY - drawH / 2
        pCon3(1) = containerMidY + drawH / 2
        pCon4(1) = containerMidY + drawH / 2
    End Sub



    ' --- Sets the start points for the grating ---
    Private Sub Create_StartPoints()
        For i = 1 To 4
            points.Add("p" & i, CallByName(Me, "pCon" & i, vbGet))
            pointsOrder.Add("p" & i)
        Next
    End Sub



    ' --- Draw all the lines for the container and grating ---
    Private Sub DrawingPanel_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs)
        Dim penCon As Pen = New Pen(Color.DarkRed, 1)
        penCon.DashPattern = {4, 8}
        e.Graphics.DrawLine(penCon, CInt(pCon1(0)), CInt(pCon1(1)), CInt(pCon2(0)), CInt(pCon2(1)))
        e.Graphics.DrawLine(penCon, CInt(pCon2(0)), CInt(pCon2(1)), CInt(pCon3(0)), CInt(pCon3(1)))
        e.Graphics.DrawLine(penCon, CInt(pCon3(0)), CInt(pCon3(1)), CInt(pCon4(0)), CInt(pCon4(1)))
        e.Graphics.DrawLine(penCon, CInt(pCon4(0)), CInt(pCon4(1)), CInt(pCon1(0)), CInt(pCon1(1)))

        Dim pen As Pen = New Pen(Color.Black, 1)
        For i = 0 To pointsOrder.Count - 1
            Dim pTemp1() As Decimal
            Dim pTemp2() As Decimal

            pTemp1 = points(pointsOrder(i))
            Try
                pTemp2 = points(pointsOrder(i + 1))
            Catch ex As Exception
                pTemp2 = points(pointsOrder(0))
            End Try

            e.Graphics.DrawLine(pen, CInt(pTemp1(0)), CInt(pTemp1(1)), CInt(pTemp2(0)), CInt(pTemp2(1)))
        Next
    End Sub

    ' --- Generate a table containing all the points X- and Y-values ---
    Private Function Create_PointTable()
        Dim pointTable As New DataTable
        pointTable.Columns.Add("X", GetType(Decimal))
        pointTable.Columns.Add("Y", GetType(Decimal))

        For i = 0 To pointsOrder.Count - 1
            Dim pTemp() As Decimal
            pTemp = points(pointsOrder(i))

            pointTable.Rows.Add()
            pointTable.Rows(i)("X") = pTemp(2)
            pointTable.Rows(i)("Y") = pTemp(3)
        Next

        Return pointTable
    End Function



    ' ---------------------------------- GUI interactions ----------------------------------

    Private Sub SettingsButton_Click(sender As Object, e As EventArgs) Handles SettingsButton.Click
        Program.Update_KB()
    End Sub

    Private Sub WidthBox_TextChanged(sender As Object, e As EventArgs) Handles WidthBox.TextChanged
        If WidthBox.Text <> "" Then
            If CDec(WidthBox.Text) > 0 Then
                gratingMaxW = CDec(WidthBox.Text)
                Update_GratingDimensions()
            End If
        End If
    End Sub

    Private Sub LengthBox_TextChanged(sender As Object, e As EventArgs) Handles LengthBox.TextChanged
        If LengthBox.Text <> "" Then
            If CDec(LengthBox.Text) > 0 Then
                gratingMaxL = CDec(LengthBox.Text)
                Update_GratingDimensions()
            End If
        End If
    End Sub

    Private Sub Update_GratingDimensions()
        gratingAspect = gratingMaxW / gratingMaxL

        If gratingAspect > drawAspect Then
            'Change draw height
            scaleDiff = gratingMaxW / drawW

            pCon1(1) = containerMidY - gratingMaxL / (scaleDiff * 2)
            pCon2(1) = containerMidY - gratingMaxL / (scaleDiff * 2)
            pCon3(1) = containerMidY + gratingMaxL / (scaleDiff * 2)
            pCon4(1) = containerMidY + gratingMaxL / (scaleDiff * 2)

            Set_ContainerPointsX()
        Else
            'Change draw width
            scaleDiff = gratingMaxL / drawH

            pCon1(0) = containerMidX - gratingMaxW / (scaleDiff * 2)
            pCon2(0) = containerMidX + gratingMaxW / (scaleDiff * 2)
            pCon3(0) = containerMidX + gratingMaxW / (scaleDiff * 2)
            pCon4(0) = containerMidX - gratingMaxW / (scaleDiff * 2)

            Set_ContainerPointsY()
        End If

        'Redraw grating
        Me.Refresh()

        'SW X-values
        pCon1(2) = (-gratingMaxW / 2) / 1000
        pCon2(2) = (gratingMaxW / 2) / 1000
        pCon3(2) = (gratingMaxW / 2) / 1000
        pCon4(2) = (-gratingMaxW / 2) / 1000

        'SW Y-values
        pCon1(3) = (gratingMaxL / 2) / 1000
        pCon2(3) = (gratingMaxL / 2) / 1000
        pCon3(3) = (-gratingMaxL / 2) / 1000
        pCon4(3) = (-gratingMaxL / 2) / 1000
    End Sub


    ' --- When angle button is pressed ---
    Private Sub AngleButton_Click(sender As Object, e As EventArgs) Handles AngleButton.Click
        ' Create Buttons for all clickable points
        For i = 0 To pointsOrder.Count - 1
            PointButtons.Add(New Button)

            PointButtons(i).Width = 30
            PointButtons(i).Height = 30

            PointButtons(i).Left = points(pointsOrder(i))(0) - PointButtons(i).Width / 2
            PointButtons(i).Top = points(pointsOrder(i))(1) - PointButtons(i).Height / 2

            PointButtons(i).Name = pointsOrder(i) & "_Button"
            PointButtons(i).Text = ""

            PointButtons(i).BackColor = Color.FromArgb(50, Color.Red)
            PointButtons(i).FlatStyle = FlatStyle.Flat
            PointButtons(i).FlatAppearance.BorderSize = 0
            PointButtons(i).FlatAppearance.MouseOverBackColor = Color.Red
            PointButtons(i).FlatAppearance.MouseDownBackColor = Color.DarkRed

            Dim gp As New Drawing.Drawing2D.GraphicsPath
            gp.AddEllipse(New Rectangle(New Point(0, 0), New Size(30, 30)))
            PointButtons(i).Region = New Region(gp)

            containerPanel.Controls.Add(PointButtons(i))

            AddHandler PointButtons(i).Click, AddressOf PointButton_Click
        Next

        angleCounter = angleCounter + 1
    End Sub

    ' --- When a point button for angle recess is pressed ---
    Private Sub PointButton_Click(sender As Button, e As EventArgs)
        'Determine which point is being pressed
        Dim pointPressed As String = sender.Name.Split("_")(0)
        Dim index As Integer = pointsOrder.IndexOf(pointPressed)

        'Retrive that points coords
        Dim pXP As Decimal = points(pointPressed)(0)
        Dim pYP As Decimal = points(pointPressed)(1)
        Dim pXSW As Decimal = points(pointPressed)(2)
        Dim pYSW As Decimal = points(pointPressed)(3)

        Dim d1P As Decimal = AngleD1.Text / scaleDiff
        Dim d2P As Decimal = AngleD2.Text / scaleDiff
        Dim d1SW As Decimal = AngleD1.Text / 1000
        Dim d2SW As Decimal = AngleD2.Text / 1000

        If pXP < containerMidX Then
            If pYP > containerMidY Then
                'Kvadrant 4
                points.Add("pA" & angleCounter * 2 - 1, {pXP + d1P, pYP, pXSW + d1SW, pYSW})
                points.Add("pA" & angleCounter * 2, {pXP, pYP - d2P, pXSW, pYSW + d2SW})
            Else
                'Kvadrant 1
                points.Add("pA" & angleCounter * 2 - 1, {pXP, pYP + d2P, pXSW, pYSW - d2SW})
                points.Add("pA" & angleCounter * 2, {pXP + d1P, pYP, pXSW + d1SW, pYSW})
            End If
        Else
            If pYP > containerMidY Then
                'Kvadrant 3
                points.Add("pA" & angleCounter * 2 - 1, {pXP, pYP - d2P, pXSW, pYSW + d2SW})
                points.Add("pA" & angleCounter * 2, {pXP - d1P, pYP, pXSW - d1SW, pYSW})
            Else
                'Kvadrant 2
                points.Add("pA" & angleCounter * 2 - 1, {pXP - d1P, pYP, pXSW - d1SW, pYSW})
                points.Add("pA" & angleCounter * 2, {pXP, pYP + d2P, pXSW, pYSW - d2SW})
            End If
        End If

        'Insert two new points 
        pointsOrder.Insert(index + 1, "pA" & angleCounter * 2 - 1)
        pointsOrder.Insert(index + 2, "pA" & angleCounter * 2)
        pointsOrder.RemoveAt(index)

        For i = 0 To PointButtons.Count - 1
            RemoveHandler PointButtons(0).Click, AddressOf PointButton_Click
            containerPanel.Controls.RemoveByKey(PointButtons(0).Name)
            PointButtons.RemoveAt(0)
        Next

        'Redraw grating
        Me.Refresh()
    End Sub

    ' --- When export to SW button is pressed ---
    Private Sub ExportSWButton_Click(sender As Object, e As EventArgs) Handles ExportSWButton.Click
        Dim exportTable As DataTable
        exportTable = Create_ExportTable()


        Program.Build_Grating(exportTable)

        'Test för att SW API
        Dim pointTable As New DataTable
        pointTable = Create_PointTable()

        Program.Export_SW(pointTable)
        Program.Create_Drawing()
    End Sub

    Private Function Create_ExportTable() As DataTable
        Dim gratingTable As New DataTable
        gratingTable.Columns.Add("TYPE", GetType(String))
        gratingTable.Columns.Add("SERRATED", GetType(Boolean))
        gratingTable.Columns.Add("WIDTH", GetType(Decimal))
        gratingTable.Columns.Add("LENGTH", GetType(Decimal))

        gratingTable.Rows.Add()
        gratingTable.Rows(0)("TYPE") = "pressure_welded" ' Här behövs namn på HLCt modellen
        gratingTable.Rows(0)("SERRATED") = False
        gratingTable.Rows(0)("WIDTH") = CDec(WidthBox.Text)
        gratingTable.Rows(0)("LENGTH") = CDec(LengthBox.Text)

        Return gratingTable
    End Function
End Class