Imports IntraSell_DLL
Imports IntraSell_Net_Base
Imports MySql.Data.MySqlClient

Module ModuleBerechtigung

    Dim MitarbeiterRechte As New Dictionary(Of String, Boolean)

    Sub New()
        FillCache
    End Sub

    Friend Sub FillCache()
        MitarbeiterRechte.Clear()
        Dim cmd As New MySqlCommand("select * from `ofmitarbeiter-rechte`")
        Dim alle = OpenRecordsetInMemoryWithNewConnection(cmd)
        For Each r In alle.Rows
            Dim key = r("MitarbeiterIDNR") & "_" & r("Recht")
            If Not MitarbeiterRechte.ContainsKey(key) Then
                MitarbeiterRechte.Add(key, r("erlaubt"))
            End If
        Next
    End Sub

    Public Function HasRecht(Berechtigung As String, Optional Interaktiv As Boolean = False) As Boolean
        Return HasRecht(MitarbeiterID, Berechtigung, Interaktiv)
    End Function

    Public Function HasRecht(MitarbeiterId As Integer, Berechtigung As String, Interaktiv As Boolean) As Boolean
        If MitarbeiterId = 0 Then
            Return True
        End If
        Dim check = HasRecht(MitarbeiterId, Berechtigung)
        If Interaktiv AndAlso Not check Then
            Dim msg = String.Format(Messages.Rechte_Mitarbeiter_hat_nicht_berechtigt, MitarbeiterId, Berechtigung)
            MsgBox(msg, vbInformation)
        End If
        Return check
    End Function

    Public Function HasRecht(MitarbeiterId As Integer, Berechtigung As String) As Boolean
        Dim key = MitarbeiterId & "_" & Berechtigung
        If MitarbeiterRechte.ContainsKey(key) Then
            Return MitarbeiterRechte(key)
        End If
        Dim result = HasRechtNoCache(MitarbeiterId, Berechtigung)
        MitarbeiterRechte.Add(key, result)
        Return result
    End Function

    Public Function HasRechtNoCache(MitarbeiterId As Integer, Berechtigung As String) As Boolean
        Try
            If MitarbeiterId = -1 Then
                Return False
            End If

            If MitarbeiterId = 0 Then
                Return True
            End If

            Dim cmd = New MySqlCommand("select erlaubt from `ofmitarbeiter-rechte` where mitarbeiterIdnr=@idnr and Recht=@recht")
            cmd.Parameters.AddWithValue("idnr", MitarbeiterId)
            cmd.Parameters.AddWithValue("recht", Berechtigung)

            Dim res As String = FirstRow(cmd)
            If MitarbeiterId > 0 AndAlso IsNull(res) OrElse res = NOT_AVAILABLE Then
                RechtEinfuegen(MitarbeiterId, Berechtigung, True)
                Return True
            End If
            Return res
        Catch ex As Exception
            HandleAppError(ex)
            Return False
        End Try
    End Function

    Function HatRechtDefiniert(MitarbeiterId As Integer, Berechtigung As String)
        Dim cmd = New MySqlCommand("select erlaubt from `ofmitarbeiter-rechte` where mitarbeiterIdnr=@idnr and Recht=@recht")
        cmd.Parameters.AddWithValue("idnr", MitarbeiterId)
        cmd.Parameters.AddWithValue("recht", Berechtigung)

        Dim res As String = FirstRow(cmd)
        Return Not (IsNull(res) OrElse res = NOT_AVAILABLE)
    End Function

    Sub RechtEinfuegen(MitarbeiterId As Integer, Berechtigung As String, erlaubt As Boolean)
        If HatRechtDefiniert(MitarbeiterId, Berechtigung) Then
            Dim cmd As New MySqlCommand("UPDATE `ofmitarbeiter-rechte` SET Erlaubt = @erlaubt WHERE  mitarbeiterIdnr=@idnr and Recht=@recht ")
            cmd.Parameters.AddWithValue("idnr", MitarbeiterId)
            cmd.Parameters.AddWithValue("recht", Berechtigung)
            cmd.Parameters.AddWithValue("erlaubt", erlaubt)
            RunSQL(cmd)
        Else
            Dim cmd As New MySqlCommand("INSERT IGNORE INTO `ofmitarbeiter-rechte` (id,  mitarbeiterIdnr, Recht, Erlaubt) Values ( @id,  @idnr , @recht, @erlaubt)")
            cmd.Parameters.AddWithValue("id", NextId("`ofmitarbeiter-rechte`", "Id"))
            cmd.Parameters.AddWithValue("idnr", MitarbeiterId)
            cmd.Parameters.AddWithValue("recht", Berechtigung)
            cmd.Parameters.AddWithValue("erlaubt", erlaubt)
            RunSQL(cmd)
        End If
        MitarbeiterRechte.Clear()
    End Sub

    Sub AlleRechteEinfuegen(IDNR As Integer)
        Dim cmd As New MySqlCommand(
            $"INSERT IGNORE INTO `ofMitarbeiter-rechte` (MitarbeiterIDNR, Recht, Erlaubt)
             SELECT @IDNR, Recht, False from `ofMitarbeiter-rechte` r1
             WHERE not exists (select 1 from `ofMitarbeiter-rechte` r2 where r2.recht=r1.recht and r2.mitarbeiterIDNR=@IDNR) 
             GROUP BY recht ")
        cmd.Parameters.AddWithValue("IDNR", IDNR)
        RunSQL(cmd)
    End Sub

    Public Sub GastroModusAktivieren()
        ModuleMitarbeiter.MitarbeiterAnlegen(99, "Chef", "Chef", "99", "99")
        ModuleMitarbeiter.MitarbeiterAnlegen(1, "Kellner", "Kellner 1", "11", "11")
        ModuleMitarbeiter.MitarbeiterAnlegen(2, "Kellner", "Kellner 2", "22", "22")
        ModuleMitarbeiter.MitarbeiterAnlegen(3, "Kellner", "Kellner 3", "33", "33")

        SetzeRechteFuerChef(99)
        SetzeRechteFuerKellner(1)
        SetzeRechteFuerKellner(2)
        SetzeRechteFuerKellner(3)
    End Sub

    Public Sub ZustellModusAktivieren()
        ModuleMitarbeiter.MitarbeiterAnlegen(99, "Chef", "Chef", "99", "99")
        ModuleMitarbeiter.MitarbeiterAnlegen(1, "Zusteller", "Zusteller 1", "11", "11")
        ModuleMitarbeiter.MitarbeiterAnlegen(2, "Zusteller", "Zusteller 2", "22", "22")
        ModuleMitarbeiter.MitarbeiterAnlegen(3, "Zusteller", "Zusteller 3", "33", "33")

        SetzeRechteFuerChef(99)
        SetzeRechteFuerZusteller(1)
        SetzeRechteFuerZusteller(2)
        SetzeRechteFuerZusteller(3)
    End Sub


    Public Sub FriseursalonModusAktivieren()
        ModuleMitarbeiter.MitarbeiterAnlegen(99, "Chef", "Chef", "99", "99")

        AlleRechteEinfuegen(99)
        SetzeRechteFuerFriseursalon(99)
    End Sub

    Public Sub HandelModusAktivieren()
        ModuleMitarbeiter.MitarbeiterAnlegen(99, "Chef", "Chef", "99", "99")

        AlleRechteEinfuegen(99)
        SetzeRechteFuerHandel(99)
    End Sub

    Public Sub AutowerkstattModusAktivieren()
        ModuleMitarbeiter.MitarbeiterAnlegen(99, "Chef", "Chef", "99", "99")

        AlleRechteEinfuegen(99)
        SetzeRechteFuerAutowerkstatt(99)

        SetVarValue("Fahrzeuge_autostart", "True")
        SetVarValue("Fahrzeuge_enabled", "True")
    End Sub


    Public Sub EasyKassaModusAktivieren()
        ModuleMitarbeiter.MitarbeiterAnlegen(99, "Chef", "Chef", "99", "99")
        ModuleMitarbeiter.MitarbeiterAnlegen(11, "Kassa", "Kassa", "11", "11")
        AlleRechteEinfuegen(99)
        SetzeRechteFuerEasyKassa(11)
    End Sub

    Public Sub SetzeRechteFuerChef(IDNR As Integer)
        RechtEinfuegen(IDNR, Rechte.EasyKassa, True)
        RechtEinfuegen(IDNR, Rechte.Plugins, True)
        RechtEinfuegen(IDNR, Rechte.Tische, True)
        RechtEinfuegen(IDNR, Rechte.Zustellungen, True)
        RechtEinfuegen(IDNR, Rechte.OffeneBestellungen, True)
        RechtEinfuegen(IDNR, Rechte.TelefonischeBestellung, True)


        RechtEinfuegen(IDNR, Rechte.Anrufe, False)
        RechtEinfuegen(IDNR, Rechte.Administrator, True)
        RechtEinfuegen(IDNR, Rechte.Angebot, False)
        RechtEinfuegen(IDNR, Rechte.Artikel, True)
        RechtEinfuegen(IDNR, Rechte.Artikelliste, True)
        RechtEinfuegen(IDNR, Rechte.Auftrag, False)
        RechtEinfuegen(IDNR, Rechte.Handelskassa, False)
        RechtEinfuegen(IDNR, Rechte.Kassabuch, False)
        RechtEinfuegen(IDNR, Rechte.Kassenschublade_öffnen, True)
        RechtEinfuegen(IDNR, Rechte.Kuechen_Positionen_löschen, True)
        RechtEinfuegen(IDNR, Rechte.Kunden, False)
        RechtEinfuegen(IDNR, Rechte.Kundenliste, False)
        RechtEinfuegen(IDNR, Rechte.Lager, False)
        RechtEinfuegen(IDNR, Rechte.Mahnungen, False)
        RechtEinfuegen(IDNR, Rechte.Online_Sicherung, True)
        RechtEinfuegen(IDNR, Rechte.Plugins, True)
        RechtEinfuegen(IDNR, Rechte.Preise, False)
        RechtEinfuegen(IDNR, Rechte.Rechnung, False)
        RechtEinfuegen(IDNR, Rechte.Rechnung_stornieren, False)
        RechtEinfuegen(IDNR, Rechte.Rezept_Stückliste, False)
        RechtEinfuegen(IDNR, Rechte.Vorgangliste, True)
        RechtEinfuegen(IDNR, Rechte.Zwischenrechnung_erstellen, False)

    End Sub

    Public Sub SetzeRechteFuerKellner(IDNR As Integer)
        RechtEinfuegen(IDNR, Rechte.EasyKassa, True)
        RechtEinfuegen(IDNR, Rechte.Plugins, True)
        RechtEinfuegen(IDNR, Rechte.Tische, True)
        RechtEinfuegen(IDNR, Rechte.Zustellungen, False)
        RechtEinfuegen(IDNR, Rechte.OffeneBestellungen, True)
        RechtEinfuegen(IDNR, Rechte.TelefonischeBestellung, True)

        RechtEinfuegen(IDNR, Rechte.Anrufe, False)
        RechtEinfuegen(IDNR, Rechte.Administrator, False)
        RechtEinfuegen(IDNR, Rechte.Angebot, False)
        RechtEinfuegen(IDNR, Rechte.Artikel, False)
        RechtEinfuegen(IDNR, Rechte.Artikelliste, False)
        RechtEinfuegen(IDNR, Rechte.Auftrag, False)
        RechtEinfuegen(IDNR, Rechte.Handelskassa, False)
        RechtEinfuegen(IDNR, Rechte.Kassabuch, False)
        RechtEinfuegen(IDNR, Rechte.Kassenschublade_öffnen, False)
        RechtEinfuegen(IDNR, Rechte.Kuechen_Positionen_löschen, False)
        RechtEinfuegen(IDNR, Rechte.Kunden, False)
        RechtEinfuegen(IDNR, Rechte.Kundenliste, False)
        RechtEinfuegen(IDNR, Rechte.Lager, False)
        RechtEinfuegen(IDNR, Rechte.Mahnungen, False)
        RechtEinfuegen(IDNR, Rechte.Online_Sicherung, False)
        RechtEinfuegen(IDNR, Rechte.Plugins, True)
        RechtEinfuegen(IDNR, Rechte.Preise, False)
        RechtEinfuegen(IDNR, Rechte.Rechnung, False)
        RechtEinfuegen(IDNR, Rechte.Rechnung_stornieren, False)
        RechtEinfuegen(IDNR, Rechte.Rezept_Stückliste, False)
        RechtEinfuegen(IDNR, Rechte.Vorgangliste, False)
        RechtEinfuegen(IDNR, Rechte.Zwischenrechnung_erstellen, False)

    End Sub

    Public Sub SetzeRechteFuerZusteller(IDNR As Integer)
        RechtEinfuegen(IDNR, Rechte.EasyKassa, False)
        RechtEinfuegen(IDNR, Rechte.Plugins, True)
        RechtEinfuegen(IDNR, Rechte.Tische, False)
        RechtEinfuegen(IDNR, Rechte.Zustellungen, True)
        RechtEinfuegen(IDNR, Rechte.OffeneBestellungen, True)
        RechtEinfuegen(IDNR, Rechte.TelefonischeBestellung, True)

        RechtEinfuegen(IDNR, Rechte.Anrufe, False)
        RechtEinfuegen(IDNR, Rechte.Administrator, False)
        RechtEinfuegen(IDNR, Rechte.Angebot, False)
        RechtEinfuegen(IDNR, Rechte.Artikel, False)
        RechtEinfuegen(IDNR, Rechte.Artikelliste, False)
        RechtEinfuegen(IDNR, Rechte.Auftrag, False)
        RechtEinfuegen(IDNR, Rechte.Handelskassa, False)
        RechtEinfuegen(IDNR, Rechte.Kassabuch, False)
        RechtEinfuegen(IDNR, Rechte.Kassenschublade_öffnen, False)
        RechtEinfuegen(IDNR, Rechte.Kuechen_Positionen_löschen, False)
        RechtEinfuegen(IDNR, Rechte.Kunden, False)
        RechtEinfuegen(IDNR, Rechte.Kundenliste, False)
        RechtEinfuegen(IDNR, Rechte.Lager, False)
        RechtEinfuegen(IDNR, Rechte.Mahnungen, False)
        RechtEinfuegen(IDNR, Rechte.Online_Sicherung, False)
        RechtEinfuegen(IDNR, Rechte.Plugins, True)
        RechtEinfuegen(IDNR, Rechte.Preise, False)
        RechtEinfuegen(IDNR, Rechte.Rechnung, False)
        RechtEinfuegen(IDNR, Rechte.Rechnung_stornieren, False)
        RechtEinfuegen(IDNR, Rechte.Rezept_Stückliste, False)
        RechtEinfuegen(IDNR, Rechte.Vorgangliste, False)
        RechtEinfuegen(IDNR, Rechte.Zwischenrechnung_erstellen, False)

    End Sub

    Public Sub SetzeRechteFuerFriseursalon(IDNR As Integer)

        RechtEinfuegen(IDNR, Rechte.Administrator, True)
        RechtEinfuegen(IDNR, Rechte.EasyKassa, True)
        RechtEinfuegen(IDNR, Rechte.Plugins, True)
        RechtEinfuegen(IDNR, Rechte.Tische, False)
        RechtEinfuegen(IDNR, Rechte.Zustellungen, False)
        RechtEinfuegen(IDNR, Rechte.OffeneBestellungen, False)
        RechtEinfuegen(IDNR, Rechte.TelefonischeBestellung, False)

        RechtEinfuegen(IDNR, Rechte.Anrufe, False)
        RechtEinfuegen(IDNR, Rechte.Angebot, False)
        RechtEinfuegen(IDNR, Rechte.Artikel, False)
        RechtEinfuegen(IDNR, Rechte.Artikelliste, False)
        RechtEinfuegen(IDNR, Rechte.Auftrag, False)
        RechtEinfuegen(IDNR, Rechte.Handelskassa, False)
        RechtEinfuegen(IDNR, Rechte.Kassabuch, False)
        RechtEinfuegen(IDNR, Rechte.Kassenschublade_öffnen, False)
        RechtEinfuegen(IDNR, Rechte.Kuechen_Positionen_löschen, False)
        RechtEinfuegen(IDNR, Rechte.Kunden, False)
        RechtEinfuegen(IDNR, Rechte.Kundenliste, False)
        RechtEinfuegen(IDNR, Rechte.Lager, False)
        RechtEinfuegen(IDNR, Rechte.Mahnungen, False)
        RechtEinfuegen(IDNR, Rechte.Online_Sicherung, True)
        RechtEinfuegen(IDNR, Rechte.Plugins, True)
        RechtEinfuegen(IDNR, Rechte.Preise, False)
        RechtEinfuegen(IDNR, Rechte.Rechnung, False)
        RechtEinfuegen(IDNR, Rechte.Rechnung_stornieren, False)
        RechtEinfuegen(IDNR, Rechte.Rezept_Stückliste, False)
        RechtEinfuegen(IDNR, Rechte.Vorgangliste, False)
        RechtEinfuegen(IDNR, Rechte.Zwischenrechnung_erstellen, False)

    End Sub

    Public Sub SetzeRechteFuerHandel(IDNR As Integer)

        RechtEinfuegen(IDNR, Rechte.Administrator, True)
        RechtEinfuegen(IDNR, Rechte.EasyKassa, True)
        RechtEinfuegen(IDNR, Rechte.Plugins, True)
        RechtEinfuegen(IDNR, Rechte.Tische, False)
        RechtEinfuegen(IDNR, Rechte.Zustellungen, False)
        RechtEinfuegen(IDNR, Rechte.OffeneBestellungen, False)
        RechtEinfuegen(IDNR, Rechte.TelefonischeBestellung, False)

        RechtEinfuegen(IDNR, Rechte.Anrufe, False)
        RechtEinfuegen(IDNR, Rechte.Angebot, False)
        RechtEinfuegen(IDNR, Rechte.Artikel, True)
        RechtEinfuegen(IDNR, Rechte.Artikelliste, True)
        RechtEinfuegen(IDNR, Rechte.Auftrag, False)
        RechtEinfuegen(IDNR, Rechte.Handelskassa, False)
        RechtEinfuegen(IDNR, Rechte.Kassabuch, False)
        RechtEinfuegen(IDNR, Rechte.Kassenschublade_öffnen, False)
        RechtEinfuegen(IDNR, Rechte.Kuechen_Positionen_löschen, False)
        RechtEinfuegen(IDNR, Rechte.Kunden, False)
        RechtEinfuegen(IDNR, Rechte.Kundenliste, False)
        RechtEinfuegen(IDNR, Rechte.Lager, True)
        RechtEinfuegen(IDNR, Rechte.Mahnungen, False)
        RechtEinfuegen(IDNR, Rechte.Online_Sicherung, True)
        RechtEinfuegen(IDNR, Rechte.Plugins, True)
        RechtEinfuegen(IDNR, Rechte.Preise, False)
        RechtEinfuegen(IDNR, Rechte.Rechnung, False)
        RechtEinfuegen(IDNR, Rechte.Rechnung_stornieren, False)
        RechtEinfuegen(IDNR, Rechte.Rezept_Stückliste, False)
        RechtEinfuegen(IDNR, Rechte.Vorgangliste, True)
        RechtEinfuegen(IDNR, Rechte.Zwischenrechnung_erstellen, False)

    End Sub


    Public Sub SetzeRechteFuerAutowerkstatt(IDNR As Integer)

        RechtEinfuegen(IDNR, Rechte.Administrator, True)
        RechtEinfuegen(IDNR, Rechte.EasyKassa, True)
        RechtEinfuegen(IDNR, Rechte.Plugins, True)
        RechtEinfuegen(IDNR, Rechte.Tische, False)
        RechtEinfuegen(IDNR, Rechte.Zustellungen, False)
        RechtEinfuegen(IDNR, Rechte.OffeneBestellungen, True)
        RechtEinfuegen(IDNR, Rechte.TelefonischeBestellung, True)

        RechtEinfuegen(IDNR, Rechte.Anrufe, False)
        RechtEinfuegen(IDNR, Rechte.Angebot, True)
        RechtEinfuegen(IDNR, Rechte.Artikel, True)
        RechtEinfuegen(IDNR, Rechte.Artikelliste, True)
        RechtEinfuegen(IDNR, Rechte.Auftrag, True)
        RechtEinfuegen(IDNR, Rechte.Handelskassa, False)
        RechtEinfuegen(IDNR, Rechte.Kassabuch, False)
        RechtEinfuegen(IDNR, Rechte.Kassenschublade_öffnen, False)
        RechtEinfuegen(IDNR, Rechte.Kuechen_Positionen_löschen, False)
        RechtEinfuegen(IDNR, Rechte.Kunden, True)
        RechtEinfuegen(IDNR, Rechte.Kundenliste, True)
        RechtEinfuegen(IDNR, Rechte.Lager, True)
        RechtEinfuegen(IDNR, Rechte.Mahnungen, False)
        RechtEinfuegen(IDNR, Rechte.Online_Sicherung, True)
        RechtEinfuegen(IDNR, Rechte.Plugins, True)
        RechtEinfuegen(IDNR, Rechte.Preise, False)
        RechtEinfuegen(IDNR, Rechte.Rechnung, True)
        RechtEinfuegen(IDNR, Rechte.Rechnung_stornieren, False)
        RechtEinfuegen(IDNR, Rechte.Rezept_Stückliste, False)
        RechtEinfuegen(IDNR, Rechte.Vorgangliste, True)
        RechtEinfuegen(IDNR, Rechte.Zwischenrechnung_erstellen, False)
    End Sub

    Public Sub SetzeRechteFuerEasyKassa(IDNR As Integer)
        RechtEinfuegen(IDNR, Rechte.Administrator, False)
        RechtEinfuegen(IDNR, Rechte.EasyKassa, True)
        RechtEinfuegen(IDNR, Rechte.Plugins, False)
        RechtEinfuegen(IDNR, Rechte.Tische, False)
        RechtEinfuegen(IDNR, Rechte.Zustellungen, False)
        RechtEinfuegen(IDNR, Rechte.OffeneBestellungen, False)
        RechtEinfuegen(IDNR, Rechte.TelefonischeBestellung, False)

        RechtEinfuegen(IDNR, Rechte.Anrufe, False)
        RechtEinfuegen(IDNR, Rechte.Angebot, False)
        RechtEinfuegen(IDNR, Rechte.Artikel, False)
        RechtEinfuegen(IDNR, Rechte.Artikelliste, False)
        RechtEinfuegen(IDNR, Rechte.Auftrag, False)
        RechtEinfuegen(IDNR, Rechte.Handelskassa, False)
        RechtEinfuegen(IDNR, Rechte.Kassabuch, False)
        RechtEinfuegen(IDNR, Rechte.Kassenschublade_öffnen, True)
        RechtEinfuegen(IDNR, Rechte.Kuechen_Positionen_löschen, True)
        RechtEinfuegen(IDNR, Rechte.Kunden, False)
        RechtEinfuegen(IDNR, Rechte.Kundenliste, False)
        RechtEinfuegen(IDNR, Rechte.Lager, False)
        RechtEinfuegen(IDNR, Rechte.Mahnungen, False)
        RechtEinfuegen(IDNR, Rechte.Online_Sicherung, False)
        RechtEinfuegen(IDNR, Rechte.Plugins, True)
        RechtEinfuegen(IDNR, Rechte.Preise, False)
        RechtEinfuegen(IDNR, Rechte.Rechnung, False)
        RechtEinfuegen(IDNR, Rechte.Rechnung_stornieren, False)
        RechtEinfuegen(IDNR, Rechte.Rezept_Stückliste, False)
        RechtEinfuegen(IDNR, Rechte.Vorgangliste, False)
        RechtEinfuegen(IDNR, Rechte.Zwischenrechnung_erstellen, False)
    End Sub

End Module
