from datetime import date
import socket

def sendeStr(komm_s, datenStr):
    datenBytes = bytes(datenStr, 'utf-8')
    komm_s.sendall(datenBytes)

def sendeTrennByte(komm_s):
    trennByte = bytes([0])
    komm_s.sendall(trennByte)

def empfangeStr(komm_s):

    weiter = True
    datenBytes = bytes()

    trennByte = bytes([0])

    while weiter:
        chunk = komm_s.recv(1)
        if chunk == trennByte or chunk == bytes([]):
            weiter = False
        else:
            datenBytes = datenBytes + chunk

    datenStr = str(datenBytes, 'utf-8')

    return datenStr

verbindungs_s = socket.socket()
verbindungs_s.bind(('', 5000))
verbindungs_s.listen(20)

while True:
    komm_s, client_adresse = verbindungs_s.accept()
    anfrageStr = empfangeStr(komm_s)
    anfrageList = anfrageStr.split('.')
    
    if len(anfrageList) == 3 and anfrageList[0].isdigit() and anfrageList[1].isdigit():
        tagGeburtstag = int(anfrageList[0])
        monatGeburtstag = int(anfrageList[1])
        
        heute = date.today()
        sendeStr(komm_s, 'Heute ist der ' + str(heute.day) + '.' + str(heute.month) + '. ')

        geburtstagAktuellesJahr = date(heute.year, monatGeburtstag, tagGeburtstag)
        
        if geburtstagAktuellesJahr < heute:
            # Der nächste Geburtstag ist erst im kommenden Jahr
            geburtstagNaechstesJahr = date(heute.year + 1, monatGeburtstag, tagGeburtstag)
            timedelta = geburtstagNaechstesJahr - heute
            sendeStr(komm_s, 'Du hast in ' + str(timedelta.days) + ' Tagen Geburtstag!')
        
        if geburtstagAktuellesJahr == heute:
            sendeStr(komm_s, 'Dein Geburtstag ist heute!')
            sendeTrennByte(komm_s)
        
        if geburtstagAktuellesJahr > heute:
            # Der nächste Geburtstag ist in diesem Jahr
            timedelta = geburtstagAktuellesJahr - heute
            sendeStr(komm_s, 'Du hast in ' + str(timedelta.days) + ' Tagen Geburtstag!')
            
    else:
        sendeStr(komm_s, 'Fehler in der Anfrage')

    sendeTrennByte(komm_s)
    komm_s.close()