Public Class Detail
    Dim jmeno() As Integer
    Dim pocetzakazek As Integer
    Dim zpozdeni() As Single
    Dim zacatek() As Single
    Dim Konec() As Single
    Dim termin() As Single
    Dim id_zak() As String
    Dim datum As Date
    Dim index As Integer
    Dim celkova_doba_vyroby As Single

    Private Sub Detail_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim i, j As Integer
        Dim pomret As String
        Dim delka As Integer
        Dim pocetreseni As Integer
        Dim pozice As Point

        Dim screenWidth As Integer = Screen.PrimaryScreen.Bounds.Width
        Dim screenHeight As Integer = Screen.PrimaryScreen.Bounds.Height

        pozice.X = (screenWidth - 100) - 250
        pozice.Y = (screenHeight - 70) / 2


        Me.Add_solution_button.Location = pozice

        pozice.X -= 200
        Me.Reseni_textbox.Location = pozice







        delka = Optimalizace.Tabulka_nejlepsich.Columns.Count - 1
        datum = Zakazky.Zacatek_prace
        pocetzakazek = Zakazky.Zakazky_tabulka.Rows.Count

        pocetreseni = Optimalizace.Tabulka_nejlepsich.Rows.Count

        For i = 0 To Optimalizace.Tabulka_nejlepsich.Rows.Count - 1
            pomret = Optimalizace.Tabulka_nejlepsich.Rows(i).Cells(0).Value
            DetailReseni.Columns.Add("Jmeno", "Kombinace" & Environment.NewLine & pomret)
            DetailReseni.Columns(i).Width = 150
        Next

        DetailReseni.Rows.Add()
        DetailReseni.Rows.Add()
        DetailReseni.Rows.Add()
        DetailReseni.Rows.Add()
        DetailReseni.Rows(0).HeaderCell.Value = "Hodnota kriteriální funkce"
        DetailReseni.Rows(1).HeaderCell.Value = "Celkový přeseřizovací čas [h]"
        DetailReseni.Rows(2).HeaderCell.Value = "Celkové zpoždění [h]"
        DetailReseni.Rows(3).HeaderCell.Value = "Celková doba výroby [h]"
        For i = 0 To pocetzakazek - 1
            DetailReseni.Rows.Add()
            DetailReseni.Rows.Add()
            DetailReseni.Rows.Add()
            DetailReseni.Rows.Add()
            DetailReseni.Rows(4 + (i * 4)).Height = 50
            DetailReseni.Rows(5 + (i * 4)).Height = 50
            DetailReseni.Rows(6 + (i * 4)).Height = 50
            DetailReseni.Rows(7 + (i * 4)).Height = 50
            DetailReseni.Rows(4 + (i * 4)).HeaderCell.Value = Zakazky.Zakazky_tabulka.Rows(i).Cells(0).Value & Environment.NewLine & "Začátek práce"
            DetailReseni.Rows(5 + (i * 4)).HeaderCell.Value = Zakazky.Zakazky_tabulka.Rows(i).Cells(0).Value & Environment.NewLine & "Dokončení zakázky"
            DetailReseni.Rows(6 + (i * 4)).HeaderCell.Value = Zakazky.Zakazky_tabulka.Rows(i).Cells(0).Value & Environment.NewLine & "Termín zakázky"
            DetailReseni.Rows(7 + (i * 4)).HeaderCell.Value = Zakazky.Zakazky_tabulka.Rows(i).Cells(0).Value & Environment.NewLine & "Zpoždění [hod]"

        Next
        For i = 0 To Optimalizace.Tabulka_nejlepsich.Rows.Count - 1




            pomret = Optimalizace.Tabulka_nejlepsich.Rows(i).Cells(0).Value

            DetailReseni.Rows(0).Cells(i).Value = Optimalizace.Tabulka_nejlepsich.Rows(i).Cells(delka).Value
            DetailReseni.Rows(1).Cells(i).Value = Optimalizace.Tabulka_nejlepsich.Rows(i).Cells(1).Value
            DetailReseni.Rows(2).Cells(i).Value = Optimalizace.Tabulka_nejlepsich.Rows(i).Cells(delka - 1).Value
            Rozdelit_retezec(pomret)
            Spocitat_zpozdeni(jmeno)
            For j = 0 To pocetzakazek - 1
                DetailReseni.Rows(4 + ((jmeno(j) - 1) * 4)).Cells(i).Value = datum.AddHours(zacatek(j))
                DetailReseni.Rows(5 + ((jmeno(j) - 1) * 4)).Cells(i).Value = datum.AddHours(Konec(j))
                DetailReseni.Rows(6 + ((jmeno(j) - 1) * 4)).Cells(i).Value = datum.AddHours(termin(j))
                DetailReseni.Rows(7 + ((jmeno(j) - 1) * 4)).Cells(i).Value = zpozdeni(j)
            Next
            DetailReseni.Rows(3).Cells(i).Value = celkova_doba_vyroby



        Next

        pomret = Vytvorit_jmeno(Zakazky.MinReseni)
        DetailReseni.Columns.Add("Jmeno", "Minimální přeseřízení" & Environment.NewLine & " Kombinace" & Environment.NewLine & pomret)
        DetailReseni.Columns(pocetreseni).Width = 150
        Spocitat_zpozdeni(Zakazky.MinReseni)
        DetailReseni.Rows(0).Cells(pocetreseni).Value = Optimalizace.Spocitat_hodnotu_kritfce(Zakazky.MinReseni)
        DetailReseni.Rows(1).Cells(pocetreseni).Value = Zakazky.min
        DetailReseni.Rows(2).Cells(pocetreseni).Value = Optimalizace.Spocitat_celkove_zpozdeni(Zakazky.MinReseni)
        For i = 0 To pocetzakazek - 1
            DetailReseni.Rows(4 + ((Zakazky.MinReseni(i) - 1) * 4)).Cells(pocetreseni).Value = datum.AddHours(zacatek(i))
            DetailReseni.Rows(5 + ((Zakazky.MinReseni(i) - 1) * 4)).Cells(pocetreseni).Value = datum.AddHours(Konec(i))
            DetailReseni.Rows(6 + ((Zakazky.MinReseni(i) - 1) * 4)).Cells(pocetreseni).Value = datum.AddHours(termin(i))
            DetailReseni.Rows(7 + ((Zakazky.MinReseni(i) - 1) * 4)).Cells(pocetreseni).Value = zpozdeni(i)

        Next
        DetailReseni.Rows(3).Cells(pocetreseni).Value = celkova_doba_vyroby


        Vykreslit_graf()

    End Sub

    Private Sub Rozdelit_retezec(retezec As String)
        Dim nazev() As String
        Dim j As Integer
        ReDim jmeno(pocetzakazek - 1)
        nazev = Split(retezec, "-")
        For j = 0 To nazev.Length - 1
            jmeno(j) = Convert.ToInt16(nazev(j))

        Next
    End Sub



    Private Sub Spocitat_zpozdeni(kombi() As Integer)
        ReDim zpozdeni(pocetzakazek - 1)
        ReDim zacatek(pocetzakazek - 1)
        ReDim Konec(pocetzakazek - 1)
        ReDim id_zak(pocetzakazek - 1)
        ReDim termin(pocetzakazek - 1)


        Dim i, index1, index2 As Integer
        Dim doba As Single
        Dim pzpozdeni As Single
        Dim celkovezpozdeni As Single
        Dim preserizeni As Single


        celkova_doba_vyroby = 0

        For i = 0 To kombi.Length - 1
            zpozdeni(i) = 0

            id_zak(i) = Zakazky.Zakazky_tabulka.Rows(kombi(i) - 1).Cells(0).Value
            termin(i) = Zakazky.ListZakazek(kombi(i) - 1).termin
        Next
        doba = Zakazky.ListZakazek(kombi(0) - 1).termin_zacatku
        For i = 0 To kombi.Length - 1
            zacatek(i) = doba - Zakazky.ListZakazek(kombi(i) - 1).termin_zacatku
            Konec(i) = zacatek(i) + Zakazky.ListZakazek(kombi(i) - 1).vyroba
            pzpozdeni = doba + (Zakazky.ListZakazek(kombi(i) - 1).vyroba - Zakazky.ListZakazek(kombi(i) - 1).termin_zacatku) - Zakazky.ListZakazek(kombi(i) - 1).termin
            If pzpozdeni < 0 Then
                celkovezpozdeni += 0
                zpozdeni(i) = pzpozdeni
            Else
                celkovezpozdeni += pzpozdeni * Zakazky.ListZakazek(kombi(i) - 1).priorita
                zpozdeni(i) = pzpozdeni
            End If

            If i = (kombi.Length - 1) Then
                celkova_doba_vyroby = doba + Zakazky.ListZakazek(kombi(i) - 1).termin_konce - Zakazky.ListZakazek(kombi(i) - 1).termin_zacatku - Zakazky.ListZakazek(kombi(0) - 1).termin_zacatku
            End If

            If i <> (kombi.Length - 1) Then


                If Zakazky.ListZakazek(kombi(i) - 1).id_vyrobku = Zakazky.ListZakazek(kombi(i + 1) - 1).id_vyrobku Then         'Preserizeni mezi dvema zakazkama, ktere vyrabi stejne vyrobky je nula
                    preserizeni = 0
                Else
                    index1 = Zakazky.ListZakazek(kombi(i) - 1).index_vyrobku
                    index2 = Zakazky.ListZakazek(kombi(i + 1) - 1).index_vyrobku
                    preserizeni = Zakazky.Serizovaci_tabulka.Rows(index1).Cells(index2).Value
                End If

                doba += preserizeni + (Zakazky.ListZakazek(kombi(i) - 1).termin_konce - Zakazky.ListZakazek(kombi(i) - 1).termin_zacatku)
            End If



        Next

    End Sub

    Private Function Vytvorit_jmeno(pole() As Integer) As String
        Dim i As Integer
        Dim hodnota As String

        For i = 0 To pole.Length - 1
            If i <> pole.Length - 1 Then
                hodnota &= Convert.ToString(pole(i)) & "-"
            Else
                hodnota &= Convert.ToString(pole(i))
            End If
        Next
        Vytvorit_jmeno = hodnota
    End Function

    Private Sub Vykreslit_graf()
        Dim i As Integer
        Dim jmenozakazky As String
        Graf_reseni.Series.Clear()

        For i = 0 To DetailReseni.Columns.Count - 1
            If i = 0 Then
                Graf_reseni.Series.Add("Celkový přeseřizovací čas [h]")
                Graf_reseni.Series("Celkový přeseřizovací čas [h]").Color = Color.Aquamarine
                Graf_reseni.Series("Celkový přeseřizovací čas [h]").BorderColor = Color.Black
                Graf_reseni.Series("Celkový přeseřizovací čas [h]").CustomProperties = "PixelPointWidth = 40"
            End If
            Graf_reseni.Series("Celkový přeseřizovací čas [h]").Points.AddXY(DetailReseni.Columns(i).HeaderCell.Value, DetailReseni.Rows(1).Cells(i).Value)


            For j = 0 To pocetzakazek - 1
                jmenozakazky = Zakazky.Zakazky_tabulka.Rows(j).Cells(0).Value
                If i = 0 Then
                    Graf_reseni.Series.Add("Zpoždění zakázky " & jmenozakazky & " [h]")
                    Graf_reseni.Series("Zpoždění zakázky " & jmenozakazky & " [h]").Points.Add(DetailReseni.Rows((j * 4) + 7).Cells(i).Value)
                    'Me.Graf1.Series("Zpoždění " & j + 1 & ". zakázky").Color = Color.Blue
                    Graf_reseni.Series("Zpoždění zakázky " & jmenozakazky & " [h]").BorderColor = Color.Black
                    Graf_reseni.Series("Zpoždění zakázky " & jmenozakazky & " [h]").CustomProperties = "PixelPointWidth = 40"
                Else
                    Graf_reseni.Series("Zpoždění zakázky " & jmenozakazky & " [h]").Points.Add(DetailReseni.Rows((j * 4) + 7).Cells(i).Value)
                End If
            Next
        Next
    End Sub

    Private Sub Add_solution_button_Click(sender As Object, e As EventArgs) Handles Add_solution_button.Click
        Dim nove_reseni As String

        nove_reseni = Reseni_textbox.Text

        Try
            Rozdelit_retezec(nove_reseni)
        Catch ex As Exception
            MsgBox("CHYBA! Řešení musí být zadáno správně, viz nápověda.")
        End Try


        Try
            Pridat_reseni_do_tabulky(jmeno)
        Catch ex As Exception
            MsgBox("CHYBA! Řešení musí být zadáno ve formě např. 1-2-3-4 a musí obsahovat všechny zakázky.")
            DetailReseni.Columns.RemoveAt(DetailReseni.Columns.Count - 1)
            Exit Sub
        End Try

    End Sub

    Private Sub Pridat_reseni_do_tabulky(reseni() As Integer)
        Dim pomret As String
        Dim sloupec As Integer
        Dim i As Integer



        sloupec = DetailReseni.Columns.Count
        pomret = Vytvorit_jmeno(reseni)
        DetailReseni.Columns.Add("Jmeno", "Vlastní řešení" & Environment.NewLine & " Kombinace" & Environment.NewLine & pomret)
        DetailReseni.Columns(sloupec).Width = 150
        Spocitat_zpozdeni(reseni)
        DetailReseni.Rows(0).Cells(sloupec).Value = Optimalizace.Spocitat_hodnotu_kritfce(reseni)
        DetailReseni.Rows(1).Cells(sloupec).Value = Optimalizace.Spocitat_dobu_preserizeni(reseni)
        DetailReseni.Rows(2).Cells(sloupec).Value = Optimalizace.Spocitat_celkove_zpozdeni(reseni)
        DetailReseni.Rows(3).Cells(sloupec).Value = celkova_doba_vyroby
        For i = 0 To pocetzakazek - 1
            DetailReseni.Rows(4 + ((Zakazky.MinReseni(i) - 1) * 4)).Cells(sloupec).Value = datum.AddHours(zacatek(i))
            DetailReseni.Rows(5 + ((Zakazky.MinReseni(i) - 1) * 4)).Cells(sloupec).Value = datum.AddHours(Konec(i))
            DetailReseni.Rows(6 + ((Zakazky.MinReseni(i) - 1) * 4)).Cells(sloupec).Value = datum.AddHours(termin(i))
            DetailReseni.Rows(7 + ((Zakazky.MinReseni(i) - 1) * 4)).Cells(sloupec).Value = zpozdeni(i)
        Next

        Vykreslit_graf()
    End Sub

    Private Sub OAplikaciToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles OAplikaciToolStripMenuItem.Click
        About.Show()
    End Sub

    Private Sub NápovědaToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles NápovědaToolStripMenuItem.Click
        Help_Detail.Show()
    End Sub
End Class