from socketLib import IVerbindungsSocket
import threading

# Liste zur Verwaltung der Nachrichten
# Datentyp einer Nachricht: Tupel (Absender / Empfänger / Nachricht)
nachrichten = []

# Server für die Annahme von Verbindungen vorbereiten
verbindungs_s = IVerbindungsSocket()
verbindungs_s.anPortBinden(5003)

lock = threading.Lock()

def handleClient(komm_s):
    global nachrichten
    
    # Anfrage empfangen
    anfrageStr = komm_s.empfangeStringBis(0)
    
    # Anfrage in eine Liste aus Strings zerlegen
    anfrage = anfrageStr.split(':')
    
    with lock:
        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)
        
        with lock:
            print('neue Nachricht: ' + str(neueNachricht))
            
            # neue Nachricht in Liste speichern
            nachrichten = nachrichten + [neueNachricht]
        
        # Antwort an den Client schicken
        komm_s.sendeString('OK')
        komm_s.sendeBytes([0])
        
        # Kommunikationssocket schließen
        komm_s.trennen()
        
    elif anfrage[0] == 'HOLE_NACHRICHT':
        empfaenger = anfrage[1]
        
        with lock:
            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'
        
        komm_s.sendeString(antwortStr)
        komm_s.sendeBytes([0])
        komm_s.trennen()
        
    elif anfrage[0] == 'ZAEHLE_NEUE_NACHRICHTEN':
        empfaenger = anfrage[1]
        
        with lock:
            # Nachrichten zählen
            anzahl = 0
            for nachricht in nachrichten:
                if nachricht[1] == empfaenger:
                    anzahl = anzahl + 1
        
        anzahlStr = str(anzahl)
        
        komm_s.sendeString(anzahlStr)
        komm_s.sendeBytes([0])
        komm_s.trennen()
           
    elif anfrage[0] == 'PRINTDB':
        with lock:
            for n in nachrichten:
                print(n)
        komm_s.trennen()
    
    else:
        komm_s.sendeString('Fehler in der Anfrage')
        komm_s.sendeBytes([0])
        komm_s.trennen()

while True:
    # Eine Verbindung annehmen
    komm_s = verbindungs_s.verbindungAnnehmen()
    
    with lock:
        print('Anfrage von ' +  str(komm_s.komm_s.getpeername()))
    
    t = threading.Thread(target=handleClient, args=(komm_s,))
    t.start()
    
#     try:
#         handleClient(komm_s)
#     except Exception as e:
#         print('Exception bei der Behandlung einer Anfrage: ', e)