'Option Strict On
Option Explicit On

Imports IntraSell_DLL
Imports IntraSell_Net_Base
Imports MySql.Data.MySqlClient

Public Class TouchOrders
    Dim _MitarbeiterNr As Integer = MitarbeiterID

    Public Property MitarbeiterNr As Integer
        Get
            Return _MitarbeiterNr
        End Get
        Set(value As Integer)
            If value > 0 Then
                _MitarbeiterNr = value
                OrderListe.CurrentMitarbeiterNr = value
            End If
        End Set
    End Property

    Shared MitarbeiterName As String

    Dim FremdeTischeBedienen As Boolean = True
    Dim MessageLabel As New Label
    Dim settings As New ClassSettings()
    Dim LetzteDatenAktualiserungAm As Date = Now.AddDays(-1)
    Dim TOUCH_ORDERS_LISTE As Boolean = False
    Dim NeedsRefreshUI As Boolean = False

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub TouchOrders_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Try
            ApplyStyle
            FremdeTischeBedienen = HasRecht(Rechte.Fremde_Tische_bedienen)
            TOUCH_ORDERS_LISTE = VarValue_Default("TOUCH_ORDERS_LISTE_" & Net.Dns.GetHostName, True)

            AddHandler Tische1.Order_ClickEvent, AddressOf Order_Click
            AddHandler TischeRaum2.Order_ClickEvent, AddressOf Order_Click
            AddHandler TischeRaum3.Order_ClickEvent, AddressOf Order_Click
            AddHandler TischeRaum4.Order_ClickEvent, AddressOf Order_Click
            AddHandler OrderListe.Selected, AddressOf OrderListeSelectedChanged

            UcToken1.RegisterKeyDown(Me)
            UcToken1.RegisterKeyDown(Parent)
            SetzeRaumnamen()

            AddHandler ModuleGlobal.CommandRequestEvent, AddressOf ModuleGlobal_CommandRequestHandler

        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub

    Sub ApplyStyle()

        ModuleStyle.StylePanel(TableLayoutPanel2)
        ModuleStyle.Style(TabControl1)
        ModuleStyle.StyleButton(ButtonAktualisieren)
        ModuleStyle.StyleButton(ButtonRestaurantKassa)
        ModuleStyle.StyleButton(ButtonSchliessen)

        ModuleStyle.Style(TabControl1)
        ModuleStyle.Style(TabPageListe)
        ModuleStyle.Style(TabPageTische2)
        ModuleStyle.Style(TabPageTische3)
        ModuleStyle.Style(TabPageTische4)
        ModuleStyle.Style(TabPageTische)
    End Sub

    Private Sub ModuleGlobal_CommandRequestHandler(cmd As IntraSellCommand)
        Try
            If Me.Visible AndAlso TypeOf cmd Is IntraSellVorgangCommand Then
                NeedsRefreshUI = True
                ' Me.Invoke(Sub()
                '               DatenAktualisieren()
                '           End Sub)
            End If
        Catch ex As Exception
            HandleAppError(ex, Silent:=True)
        End Try
    End Sub

    Private Sub ButtonAktualisieren_Click(sender As Object, e As EventArgs) Handles ButtonAktualisieren.Click
        DatenAktualisieren()
    End Sub

    ''' <summary>
    ''' Eine bestehende Bestellung öffnen oder eine neue starten 
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub Order_Click(sender As Object, e As EventArgs)
        Dim btn As Button = CType(sender, Button)
        If TypeOf btn.Tag Is OffeneBestellung Then
            Dim offeneBestellung As OffeneBestellung = btn.Tag
            OeffneBestellung(offeneBestellung)
        End If
    End Sub

    Private Sub UcMitarbeiter1_MitarbeiterSelected(ByRef _MitarbeiterNr As Integer, ByRef MitarbeiterName As String) Handles UcMitarbeiter1.MitarbeiterSelected
        Try
            MitarbeiterNr = _MitarbeiterNr
            LabelMitarbeiterName.Text = MitarbeiterName
            DatenAktualisieren()
        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub

    Private Sub ButtonSchliessen_Click(sender As Object, e As EventArgs) Handles ButtonSchliessen.Click
        Try
            CType(Parent, Form).Close()
        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub

    Function FindByTag(p As Panel, tag As String) As Control
        For Each c As Control In p.Controls
            If c.Tag IsNot Nothing Then
                If c.Tag = tag Then Return c
            End If
        Next
        Return Nothing
    End Function

    Public Sub DatenAktualisieren()
        Try
            If (Now - LetzteDatenAktualiserungAm).TotalSeconds < 1 Then
                Return
            End If
            NeedsRefreshUI = False
            LetzteDatenAktualiserungAm = Now
            ''If LayoutModus Then Exit Sub
            UcMitarbeiter1.DatenAktualisierenMitarbeiter()
            DatenAktualisierenOnlineOrders()

            If TabControl1.SelectedIndex = 0 Then
                DatenAktualisierenOrdersAsListe()
            End If
            If TabControl1.SelectedIndex = 1 Then
                Tische1.DatenAktualisieren()
            End If
            If TabControl1.SelectedIndex = 2 Then
                TischeRaum2.DatenAktualisieren()
            End If
            If TabControl1.SelectedIndex = 3 Then
                TischeRaum3.DatenAktualisieren()
            End If
            If TabControl1.SelectedIndex = 4 Then
                TischeRaum4.DatenAktualisieren()
            End If
            SetzeRaumnamen()
        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub

    Private Sub SetzeRaumnamen()
        Try
            If ExistsVarValue("RAUMBEZEICHNUNG_" & Tische1.RaumCode) Then
                TabPageTische.Text = VarValue("RAUMBEZEICHNUNG_" & Tische1.RaumCode)
                Tische1.RaumBezeichnung = TabPageTische.Text
            End If

            If ExistsVarValue("RAUMBEZEICHNUNG_" & TischeRaum2.RaumCode) Then
                TabPageTische2.Text = VarValue("RAUMBEZEICHNUNG_" & TischeRaum2.RaumCode)
                TischeRaum2.RaumBezeichnung = TabPageTische2.Text
            End If

            If ExistsVarValue("RAUMBEZEICHNUNG_" & TischeRaum3.RaumCode) Then
                TabPageTische3.Text = VarValue("RAUMBEZEICHNUNG_" & TischeRaum3.RaumCode)
                TischeRaum3.RaumBezeichnung = TabPageTische3.Text
            End If

            If ExistsVarValue("RAUMBEZEICHNUNG_" & TischeRaum4.RaumCode) Then
                TabPageTische4.Text = VarValue("RAUMBEZEICHNUNG_" & TischeRaum4.RaumCode)
                TischeRaum4.RaumBezeichnung = TabPageTische4.Text
            End If

        Catch ex As Exception
            HandleAppError(ex, Silent:=True)
        End Try
    End Sub

    Private Sub Tische1_RaumbezeichnungGeaendert() Handles Tische1.RaumbezeichnungGeaendert, TischeRaum2.RaumbezeichnungGeaendert, TischeRaum3.RaumbezeichnungGeaendert, TischeRaum4.RaumbezeichnungGeaendert
        Try
            SetzeRaumnamen()
        Catch ex As Exception

        End Try
    End Sub

    Private Sub TimerRefresh_Tick(sender As Object, e As EventArgs) Handles TimerRefresh.Tick
        DatenAktualisieren()
    End Sub

    Private Sub UcOrderSysteme1_SystemAusgewaehlt(system As Object) Handles UcOrderSysteme1.SystemAusgewaehlt
        Try
            OrderListe.FilterBySystem(system)
        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub

    Private Sub ButtonRestaurantKassa_Click(sender As Object, e As EventArgs) Handles ButtonRestaurantKassa.Click
        ShowRestaurantKassa()
    End Sub

    Private Sub DatenAktualisierenOnlineOrders()
        Try
            UcOrderSysteme1.LadeDaten()
        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub


    Private Sub LabelMitarbeiterName_MouseClick(sender As Object, e As MouseEventArgs) Handles LabelMitarbeiterName.MouseClick
        Try
            Login.Logout()
            Login.ShowDialog()
            UcMitarbeiter1.DatenAktualisierenMitarbeiter()
        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <remarks></remarks>
    Sub DatenAktualisierenOrdersAsListe()
        Try
            OrderListe.LadeDaten()
        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub

    Public Sub ZeigeListe(alsListe As Boolean)
        TOUCH_ORDERS_LISTE = alsListe
        SetVarValue("TOUCH_ORDERS_LISTE_" & Net.Dns.GetHostName, alsListe)
        CheckBoxListe_CheckedChanged()
    End Sub


    Private Sub CheckBoxListe_CheckedChanged()
        Try
            If TOUCH_ORDERS_LISTE Then
                TabControl1.SelectTab(TabPageListe)
            Else
                TabControl1.SelectTab(TabPageTische)
                'TabPageTische.Focus()
            End If
            'DatenAktualisieren()
        Catch ex As Exception

        End Try
    End Sub


    Sub StarteNeueBestellung(neueBestellung As OffeneBestellung)
        OeffneBestellung(neueBestellung)
    End Sub

    Private Sub OeffneBestellung(offeneBestellung As OffeneBestellung)

        Try
            WriteLog($"ÖffneBestellung für {offeneBestellung.Name}")
            MitarbeiterID = MitarbeiterNr

            If offeneBestellung.Nummer = 0 Then
                'If MsgBox("Hallo " & MitarbeiterName & "! Wollen Sie eine Bestellung für " & offeneBestellung.Name & " starten?", vbYesNo) = vbYes Then
                Try
                    AbstractVorgangMitTouchForm.BeginNewVorgang_AbstractVorgangMittouchForm(VorgangTypen.AU, offeneBestellung.IDNR, offeneBestellung.Notiz, offeneBestellung.LieferMethode)
                Catch ex As Exception
                    HandleAppError(ex)
                End Try
                'End If
            Else

                'Wenn meherer orders für den selben Kunden existieren dann Fragen ob Zusammengelegt werden sollen! 
                Dim anzahlOffene = FirstRow("select count(*) from buchVorgang where Typ='AU' and abgeschlossen=0 and KundNR=" & offeneBestellung.IDNR)
                If anzahlOffene > 1 Then
                    Dim antwort = MsgBox("Es gibt mehere offene Aufträge für diesen Kunden! Wollen Sie diese zusammenlegen?", vbYesNo) = vbYes
                    If antwort Then
                        ModuleBuchVorgang.VorgaengeZusammenlegen(offeneBestellung)
                    End If
                End If

                'Vorgang für diesen Mitarbeiter übernehmen 
                Dim cmd = New MySqlCommand("update buchVorgang set MitarbeiterNr=@Mitarbeiternr where MitarbeiterNr is null and typ=@Typ and Nummer=@Nummer")
                cmd.Parameters.AddWithValue("MitarbeiterNr", MitarbeiterNr)
                cmd.Parameters.AddWithValue("Typ", offeneBestellung.Typ)
                cmd.Parameters.AddWithValue("Nummer", offeneBestellung.Nummer)
                RunSQL(cmd)

                AbstractVorgangMitTouchForm.LadeVorgangNummer(offeneBestellung.Typ, offeneBestellung.Nummer)

            End If
            AbstractVorgangMitTouchForm.MdiParent = Main
            AbstractVorgangMitTouchForm.WindowState = FormWindowState.Maximized
            AbstractVorgangMitTouchForm.ShowTouch()
            AbstractVorgangMitTouchForm.Show()

            AddHandler AbstractVorgangMitTouchForm.VorgangClosing, AddressOf DatenAktualisieren
            AddHandler AbstractVorgangMitTouchForm.FormClosing, AddressOf DatenAktualisieren
            AddHandler AbstractVorgangMitTouchForm.VorgangAbgeschlossen, AddressOf DatenAktualisieren

        Catch ex As Exception
            HandleAppError(ex)
        End Try
    End Sub

    Private Sub OrderListeSelectedChanged(Vorgang As VorgangInBearbeitung)
        Dim offen = New OffeneBestellung(Vorgang.Nummer, Vorgang.Typ, Vorgang.KundNr, Nothing)
        OeffneBestellung(offen)
    End Sub

    Private Sub FlowLayoutPanelOrders_ControlAdded(sender As Object, e As ControlEventArgs)
        Dim btn = e.Control
        AddHandler btn.Click, AddressOf Order_Click
        'dnd.AktiviereDnD(btn)
    End Sub

    Private Sub TabControl1_Click(sender As Object, e As TabControlEventArgs) Handles TabControl1.Selected
        DatenAktualisieren()
    End Sub

    Private Sub UcToken1_TokenScanned(ByRef token As String) Handles UcToken1.TokenScanned
        Try
            If LoginUserMitToken(token) Then
                MitarbeiterNr = MitarbeiterID
                MitarbeiterName = ModuleMitarbeiter.MitarbeiterName(MitarbeiterID)
                DatenAktualisieren()
            End If
        Catch ex As Exception
            HandleAppError(ex, Silent:=True)
        End Try
    End Sub

    Private Sub TimerRefreshUI_Tick(sender As Object, e As EventArgs) Handles TimerRefreshUI.Tick
        If NeedsRefreshUI Then
            DatenAktualisieren()
            NeedsRefreshUI = False
        End If
    End Sub
End Class
