import socket
from socketLib import empfangeStr, sendeStr, sendeTrennByte
    
# Liste zur Verwaltung der Nachrichten
# Datentyp einer Nachricht: Tupel (Absender / Empfänger / Nachricht)
nachrichten = []

# Server für die Annahme von Verbindungen vorbereiten
verbindungs_s = socket.socket()
verbindungs_s.bind(("", 5000))
verbindungs_s.listen(20)

while True:
    # Eine Verbindung annehmen
    komm_s, adresse = verbindungs_s.accept()
    print('Anfrage von ' +  str(adresse))
    
    # Anfrage empfangen
    anfrageStr = empfangeStr(komm_s)
    
    # Anfrage in eine Liste aus Strings zerlegen
    anfrage = anfrageStr.split(':')
    
    print(str(anfrage))
    
    if anfrage[0] == 'NEUE_NACHRICHT':
        # Tupel für die neue Nachricht erzeugen
        absender = anfrage[1]
        empfaenger = anfrage[2]
        text = anfrage[3]
        neueNachricht = (absender, empfaenger, text)
        print('neue Nachricht: ' + str(neueNachricht))
        
        # neue Nachricht in Liste speichern
        nachrichten = nachrichten + [neueNachricht]
        
        # Antwort an den Client schicken
        sendeStr(komm_s, 'OK')
        sendeTrennByte(komm_s)
        
        # Kommunikationssocket schließen
        komm_s.close()
        
    elif anfrage[0] == 'HOLE_NACHRICHT':
        empfaenger = anfrage[1]
        
        indexErsteGefundeneNachricht = -1
        
        anzahlNachrichten = len(nachrichten)
        for i in range(anzahlNachrichten):
            nachricht = nachrichten[i]
            if nachricht[1] == empfaenger and indexErsteGefundeneNachricht == -1:            
                indexErsteGefundeneNachricht = i
                break

        if indexErsteGefundeneNachricht != -1:
            # es wurde eine Nachricht gefunden
            # Antwort erstellen
            gefundeneNachricht = nachrichten[indexErsteGefundeneNachricht]
            antwortStr = nachricht[0] + ":" + nachricht[1] + ":" + nachricht[2]
            
            # Nachricht aus der Liste der Nachrichten entfernen
            nachrichten = nachrichten[:indexErsteGefundeneNachricht] + nachrichten[(indexErsteGefundeneNachricht+1):]            
        else:
            antwortStr = 'KEINE_NEUE_NACHRICHT'
        
        sendeStr(komm_s, antwortStr)
        sendeTrennByte(komm_s)
        komm_s.close()

    elif anfrage[0] == 'ZAEHLE_NEUE_NACHRICHTEN':
        empfaenger = anfrage[1]
        
        # Nachrichten zählen
        anzahl = 0
        for nachricht in nachrichten:
            if nachricht[1] == empfaenger:
                anzahl = anzahl + 1
        
        anzahlStr = str(anzahl)
        sendeStr(komm_s, anzahlStr)
        sendeTrennByte(komm_s)
        komm_s.close()
    
    elif anfrage[0] == 'PRINTDB':
        for n in nachrichten:
            print(n)
        komm_s.close()
    
    else:
        sendeStr(komm_s, 'Fehler in der Anfrage')
        sendeTrennByte(komm_s)
        komm_s.close()
