import os, sys, locale
from datetime import datetime


def erzeugeIndex(alleklassen, klassenschueler, allekurse, alleabschnitte, epochen, schuljahr, halbjahr, inputs, pdf):

    body = ''

    alleklassen = sorted(alleklassen)

    if pdf:
        body += '<a name="startseite"></a>'

    body += '<section>'

    body += '<h2>Noten '+str(schuljahr)+'/'+str((schuljahr-2000)+1)+', '+str(halbjahr)+'. Hj.</h2>'

    last_klasse = ''

    # Durchlaufe alle Klassen
    for klasse in alleklassen:

        if (last_klasse==''):
            body += '<p class="index">'
        else:
            if not(klasse.startswith(last_klasse)):
                body += '<br/>'
            else: 
                body += ' - '

        klasseschoen = klasse
        if (klasseschoen.startswith('0')):
            klasseschoen = klasseschoen[1:]

        body += '<a href="#klasse-'+klasse+'">'+klasseschoen+'</a>'

        last_klasse = klasse[0:2]

    body += '</p>'

    locale.setlocale(locale.LC_TIME, "de_DE")
    jetzt = datetime.now()  
    body += '<p class="time">Erzeugt: '+jetzt.strftime('%a %d. %B %Y, %H:%M Uhr')+'</p>'    

    body += '</section>'

    return body


def erzeugeKlassenFolien(alleklassen, klassenschueler, allekurse, alleabschnitte, epochen, schuljahr, halbjahr, inputs, pdf):

    # Optionen festlegen

    jahrgaenge_oberstufe = ''
    jahrgang_einführung = ''
    jahrgang_abi = ''
    try:
        jahrgaenge_oberstufe = inputs["Jahrgänge"]["jahrgänge_oberstufe"] + ","
        jahrgang_einführung = inputs["Jahrgänge"]["jahrgang_einführung"]
        jahrgang_abitur = inputs["Jahrgänge"]["jahrgang_abitur"]
    except KeyError:
        print('Der Schlüssel Jahrgänge oder "oberstufe" / "abijahrgang" existiert nicht in der Input-Datei!')
        exit(0)

    # Durchlaufe alle Klassen

    body = ''

    alleklassen = sorted(alleklassen)

    for klasse in alleklassen:

        if pdf:
            body += '<pdf:nextpage />'
            body += '<a name="klasse-'+klasse+'"></a>'

        body += '<section id="klasse-'+klasse+'">\n'

        klasseschoen = klasse
        if (klasseschoen.startswith('0')):
            klasseschoen = klasseschoen[1:]

        oberstufe = False
        if (klasseschoen+"," in jahrgaenge_oberstufe):
            oberstufe = True

        einführungsphase = False
        if (klasseschoen == jahrgang_einführung):
            einführungsphase = True

        qualiphase2 = False
        if (klasseschoen == jahrgang_abitur):
            qualiphase2 = True

        hometext = ''
        if pdf:
            hometext = '<a href="#startseite">&nbsp;<img class="icon" src="modules/pdf/home.svg"></img></a>&nbsp;'

        body += '<h1>'+hometext+'Klasse '+klasseschoen+'</h1>\n'
        body += '</section>\n'

        dieschueler = klassenschueler[klasse]

        # Durchlaufe alle Schüler der Klasse (bzw. Jahrgangsstufe)

        for derschueler in dieschueler:

            data = derschueler.split('#')
            name = data[0].strip()

            body += '<section>\n'

            # Bestimme die für den Schüler relevanten Abschnitte
            # und prüfe, ob sie existieren. Suche ggf. Ersatz.

            fehler = ""
            abschnitte = []
            ersatz = False

            if (qualiphase2): # Q2/13 (zwei Schuljahre relevant)

                if (halbjahr==1):

                    erster = [schuljahr-1, 1]
                    zweiter = [schuljahr-1, 2]
                    letzter = [schuljahr, 1]

                    test1 = alleabschnitte.get(derschueler+str(schuljahr-1)+str(1))
                    test2 = alleabschnitte.get(derschueler+str(schuljahr-1)+str(2))

                    if (test1 and test2):
                        
                        gewertet1 = test1[7]
                        gewertet2 = test2[7]

                        if (gewertet1=='J' and gewertet2=='J'): # Default-Fall

                            abschnitte.append(erster)
                            abschnitte.append(zweiter)

                        else: # Suche Ersatz (Schuljahr zuvor nicht gewertet, d.h. Q2 wiederholt)
                            
                            ersatz1 = alleabschnitte.get(derschueler+str(schuljahr-2)+str(1))
                            ersatz2 = alleabschnitte.get(derschueler+str(schuljahr-2)+str(2))

                            if (ersatz1 and ersatz2):

                                gewertet1 = ersatz1[7]
                                gewertet2 = ersatz2[7]

                                if (gewertet1=='J' and gewertet2=='J'):

                                    erster = [schuljahr-2, 1]
                                    zweiter = [schuljahr-2, 2]

                                    abschnitte.append(erster)
                                    abschnitte.append(zweiter)
                                else:
                                    fehler += "Lernabschnitte der Q1/12 nicht gewertet. Kein gewerteter Ersatz gefunden."    
                            else:
                                fehler += "Lernabschnitte der Q1/12 nicht gewertet. Kein Ersatz gefunden."    
                    else:
                        fehler += "Lernabschnitte der Q1/12 nicht vorhanden."

                    abschnitte.append(letzter)

                else: # 2. Halbjahr

                    erster = [schuljahr-1, 1]
                    zweiter = [schuljahr-1, 2]
                    dritter = [schuljahr, 1]
                    letzter = [schuljahr, 2]

                    test1 = alleabschnitte.get(derschueler+str(schuljahr-1)+str(1))
                    test2 = alleabschnitte.get(derschueler+str(schuljahr-1)+str(2))
                    test3 = alleabschnitte.get(derschueler+str(schuljahr)+str(1))

                    if (test3):

                        gewertet3 = test3[7]

                        if (gewertet3=='J'):

                            if test1 and test2: # Default-Fall

                                gewertet1 = test1[7]
                                gewertet2 = test2[7]

                                if (gewertet1=='J' and gewertet2=='J'): # Default-Fall
                                    abschnitte.append(erster)    
                                    abschnitte.append(zweiter)    
                                    abschnitte.append(dritter)    

                                else: # Suche Ersatz (evtl. Q1 wiederholt)

                                    erster = [schuljahr-2, 1]
                                    zweiter = [schuljahr-2, 2]

                                    dritter = [schuljahr, 1]
                                    letzter = [schuljahr, 2]

                                    ersatz1 = alleabschnitte.get(derschueler+str(schuljahr-2)+str(1))
                                    ersatz2 = alleabschnitte.get(derschueler+str(schuljahr-2)+str(2))

                                    if (ersatz1 and ersatz2):

                                        gewertet1 = ersatz1[7]
                                        jahrgang1 = ersatz1[6]

                                        gewertet2 = ersatz2[7]
                                        jahrgang2 = ersatz2[6]

                                        if (gewertet1=='J' and gewertet2=='J' and jahrgang1=='Q1' and jahrgang2=='Q1'):
                                            ersatz = True
                                            abschnitte.append(erster)    
                                            abschnitte.append(zweiter)    
                                            abschnitte.append(dritter) 
                                        else: 
                                            fehler += "Lernabschnitte Q1/12 nicht gefunden oder nicht gewertet. Kein gewerteter Ersatz gefunden."
                                            abschnitte.append(dritter)
                                    else:
                                        fehler += "Lernabschnitte Q1/12 nicht gefunden oder nicht gewertet. Kein Ersatz gefunden."
                                        abschnitte.append(dritter)

                            else:
                                fehler += "Lernabschnitte Q1.1/Q1.2 bzw. 12.1/12.2 nicht gefunden."

                        else: # Suche Ersatz (evtl. übergreifende Wiederholung)

                            erster = [schuljahr-2, 1]
                            zweiter = [schuljahr-2, 2]
                            dritter = [schuljahr-1, 1]
                            letzter = [schuljahr, 2]

                            test1 = alleabschnitte.get(derschueler+str(schuljahr-2)+str(1))
                            test2 = alleabschnitte.get(derschueler+str(schuljahr-2)+str(2))
                            test3 = alleabschnitte.get(derschueler+str(schuljahr-1)+str(1))

                            if (test1 and test2 and test3):

                                gewertet1 = test1[7]
                                gewertet2 = test2[7]
                                gewertet3 = test3[7]

                                if (gewertet1=='J' and gewertet2=='J' and gewertet3=='J'): # Default-Fall
                                    abschnitte.append(erster)    
                                    abschnitte.append(zweiter)    
                                    abschnitte.append(dritter)    

                                else: 
                                    fehler += "Lernabschnitte vor Q2.2 bzw. 13.2 nicht gefunden oder nicht gewertet. Kein gewerteter Ersatz gefunden."

                            else:
                                fehler += "Lernabschnitte vor Q2.2 bzw. 13.2 nicht gefunden oder nicht gewertet. Kein Ersatz gefunden."

                    else: 
                        fehler += "Lernabschnitte Q1.2 und Q2.1 bzw. 12.2 und 13.1 fehlen."

                    abschnitte.append(letzter) 

            else: # Jahrgang 5 bis Q1 (nur ein Jahrgang relevant)

                if (halbjahr==1):

                    erster = [schuljahr, 1]
                    abschnitte.append(erster)

                else: # 2. Halbjahr

                    erster = [schuljahr, 1]
                    zweiter = [schuljahr, 2]

                    test = alleabschnitte.get(derschueler+str(schuljahr)+str(1))
                    
                    if test:
                    
                        gewertet = test[7]
                    
                        if (gewertet=='J'):
                            abschnitte.append(erster)

                        else: # Suche Ersatz im Schuljahr zuvor
                            ersatz = True
                            ersatz = alleabschnitte.get(derschueler+str(schuljahr-1)+str(1))
                    
                            if ersatz:

                                gewertet2 = ersatz[7]

                                if (gewertet2=='J'):
                                    erster = [schuljahr-1, 1]
                                    abschnitte.append(erster)
                                else:
                                    fehler = "Lernabschnitt "+str(schuljahr)+".1 wird nicht gewertet. Kein gewerteter Ersatz gefunden."

                            else:
                                fehler = "Lernabschnitt "+str(schuljahr)+".1 wird nicht gewertet. Kein Ersatz gefunden."
                    else:
                        fehler = "Lernabschnitt "+str(schuljahr)+".1 nicht vorhanden."

                    abschnitte.append(zweiter)

            letzter_abschnitt = alleabschnitte.get(derschueler+str(schuljahr)+str(halbjahr))

            # Lernabschnitt fehlt? (Fall sollte eigentlich nicht eintreten!)
            if not(letzter_abschnitt):
                body += '<h3>'+name+', '+klasseschoen+'</h3>\n'
                body += '<h4>Fehler: kein Lernabschnitt vorhanden!</h4>\n'
                body += '</section>'
                continue

            # Lernabschnitt nicht gewertet? (Fall sollte eigentlich nicht eintreten!)
            gewertet = letzter_abschnitt[7]
            if not(gewertet=='J'):
                body += '<h3>'+name+', '+klasseschoen+'</h3>\n'
                body += '<h4>Fehler: Aktueller Lernabschnitt nicht gewertet!</h4>\n'
                body += '</section>'
                continue

            wiederholung = letzter_abschnitt[0]
            wdh_text = ""
            if (wiederholung=='J'):
                wdh_text = " (Wdh.)"

            body += '<h3>'+name+', '+klasseschoen+wdh_text+'</h3>\n'

            # Bestimme die Kurse aller Abschnitte

            allekursedesschuelers = {}

            for derabschnitt in abschnitte:

                aktuell_sj = derabschnitt[0]
                aktuell_hj = derabschnitt[1]

                kurse = allekurse.get(derschueler+str(aktuell_sj)+str(aktuell_hj))

                # Kurse fehlen? (Fall sollte eigentlich nicht eintreten!)
                if not(kurse):
                    fehler += "Kurse im Abschnitt "+str(aktuell_sj)+"."+str(aktuell_hj)+" fehlen."
                    continue

                for derkurs in kurse:
                    if derkurs[0] in allekursedesschuelers:
                        if allekursedesschuelers[derkurs[0]] == 1000:
                            allekursedesschuelers[derkurs[0]] = derkurs[8]   
                    else:
                        allekursedesschuelers[derkurs[0]] = derkurs[8]

            # Sortierung aller Kurse
            sorted_kurse = sorted(allekursedesschuelers.items(), key=lambda x:x[1])

            body += '<table>\n'

            body += '<tr><th class="halbjahr">&nbsp;</th>\n'
            for derkurs in sorted_kurse:
                kursbez = derkurs[0]
                body += '<th>'+kursbez+'</th>'
            body += '</tr>\n'

            # Durchlaufe die relevanten Abschnitte
            for derabschnitt in abschnitte:

                aktuell_sj = derabschnitt[0]
                sj_kurz = aktuell_sj - 2000
                sj_schoen = str(aktuell_sj)+"/"+str(sj_kurz+1)

                aktuell_hj = derabschnitt[1]

                aktueller_abschnitt = alleabschnitte.get(derschueler+str(aktuell_sj)+str(aktuell_hj))

                # Abschnitt fehlt? (Fall sollte eigentlich nicht eintreten!)
                if not(aktueller_abschnitt):
                    fehler += "Abschnitt "+str(aktuell_sj)+"."+str(aktuell_hj)+" fehlt."
                    continue

                aktuell_jg = aktueller_abschnitt[6]
                jg_schoen = aktuell_jg
                if (jg_schoen.startswith('0')):
                    jg_schoen = jg_schoen[1:]

                body += '<tr>\n'

                body += '<td class="halbjahr"><span class="jahrgang">'+str(jg_schoen)+'.'+str(aktuell_hj)+'</span><br/>'
                body += '<span class="schuljahr">'+str(sj_schoen)+'.'+str(aktuell_hj)+'</span></td>\n'

                kurse = allekurse.get(derschueler+str(aktuell_sj)+str(aktuell_hj))

                # Kurse fehlen? (Fall sollte eigentlich nicht eintreten!)
                if not(kurse):
                    fehler += "Kurse im Abschnitt "+str(aktuell_sj)+"."+str(aktuell_hj)+" fehlen."
                    continue

                # Durchlaufe die zuvor sortierten Gesamtkurse

                for meinkurs in sorted_kurse:

                    # Suche einen passenden Kurs im aktuellen Abschnitt
                    gefunden = False

                    for derkurs in kurse:

                        if (meinkurs[0]==derkurs[0]):

                            # Treffer!
                            gefunden = True

                            note = derkurs[3]
                            kursbez = derkurs[0]
                            lehrer = derkurs[1]
                            kursart = derkurs[2]
                            mahnung = derkurs[7]
                            
                            if (len(note)==0):
                                note = '-'

                            # Bewertung = Einfärbung der Note
                            topnoten = { '1+', '1', '1-', '2+', '2', '2-' }
                            defizite = { '5+', '5', '5-', '6' }
                            defizite_q = { '4-', '5+', '5', '5-', '6' }

                            cssklasse = ''
                            if (note in topnoten):
                                cssklasse = 'top'

                            if oberstufe:
                                if einführungsphase:
                                    if (note in defizite):
                                        cssklasse = 'def'        
                                        if (aktuell_hj==2) and (mahnung=='N'):
                                            cssklasse = 'nw'
                                else:
                                    if (note in defizite_q):
                                        cssklasse = 'def'
                                    
                            else:
                                if (note in defizite):
                                    cssklasse = 'def'
                                    if (aktuell_hj==2) and (mahnung=='N'):
                                        cssklasse = 'nw'

                            if (len(cssklasse)>0):
                                cssklasse = ' class="'+cssklasse+'"'

                            # Füge Note ein
                            body += '<td'+cssklasse+'><span class="note">'+note+'</span><br/>'

                            body += '<span class="lehrer">'+lehrer+"</span>"

                            if (len(kursart)>0 and kursart!='PUK'):
                                etext = ""
                            
                                if (kursart=="LK1" or kursart=="LK2"):
                                    etext = " lk"
                            
                                if (kursart=="AB3" or kursart=="AB4"):
                                    etext = " ab"
                            
                                body += '<br/><span class="kursart'+etext+'">'+kursart+"</span>"

                            elif ((klasse in epochen) and ((kursbez+",") in epochen[klasse])):
                                body += '<br/><span class="epoche">Epoche</span>'

                            body += '</td>\n'

                    if (not(gefunden)):
                        body += '<td></td>'

                body += '</tr>\n'

            body += '</table>\n'

            # Ergänze die Daten des Fokus-Abschnitts: Fehlstunden, Versetzung, Abschluss
            
            fehlstunden = letzter_abschnitt[4]
            if (len(fehlstunden)==0):
                fehlstunden = "-"

            unentschuldigt = letzter_abschnitt[5]
            if (len(unentschuldigt)==0):
                unentschuldigt = "-"

            if (unentschuldigt=='0' or unentschuldigt=='-'):
                ftext = 'Fehlstunden: &nbsp;'+fehlstunden+' / '+unentschuldigt
            else:
                ftext = 'Fehlstunden: &nbsp;'+fehlstunden+' / <span class="ue">'+unentschuldigt+'</span>'

            versetzt = letzter_abschnitt[1]
            abschluss = letzter_abschnitt[2]
            abschlusstyp = letzter_abschnitt[3]
            vtext = ""
            if (len(versetzt)>0):

                if (versetzt=='V'):
                    vtext += 'Versetzung: &nbsp;ja'
                elif (versetzt=='N'):
                    vtext += 'Versetzung: <span class="nv">nein</span>'
                elif (versetzt=='NP'):
                    vtext += 'Versetzung: <span class="nv">NP</span>'

            if (len(abschluss)>0 and abschluss=="1"):
            
                if (len(vtext)>0):
                    vtext += ", &nbsp;Abschluss: &nbsp;"+abschlusstyp
                else:
                    vtext = "Abschluss: "+abschlusstyp

            if pdf:
                body += '<p class="fehlversetzung">'+ftext
                if (len(vtext)>0):
                    body += ', &nbsp;'+vtext
                    body += '</p>'
            else:
                body += '<p class="fehl">'+ftext+'</p>'
                body += '<p class="versetzung">'+vtext+'</p>'

            # Ergänze evtl. Fehlerhinweis
            if (len(fehler)>0):
                body += '<p class="hinweis">Hinweis: '+fehler+'</p>'

            if pdf:
                body += '<p class="separator">&nbsp;<p>'

            body += '</section>'

    return body



def erzeugeNotenTabellen(alleklassen, klassenschueler, allekurse, alleabschnitte, epochen, schuljahr, halbjahr, inputs, pdf):

    # Optionen festlegen

    jahrgaenge_oberstufe = ''
    jahrgang_abi = ''
    try:
        jahrgaenge_oberstufe = inputs["Jahrgänge"]["jahrgänge_oberstufe"] + ","
        jahrgang_einführung = inputs["Jahrgänge"]["jahrgang_einführung"] + ","
        jahrgang_abitur = inputs["Jahrgänge"]["jahrgang_abitur"] + ","
    except KeyError:
        print('Der Schlüssel Jahrgänge oder "oberstufe" / "abijahrgang" existiert nicht in der Input-Datei!')
        exit(0)

    # Durchlaufe alle Klassen
    body = ''

    alleklassen = sorted(alleklassen)

    for klasse in alleklassen:

        klasseschoen = klasse
        if (klasseschoen.startswith('0')):
            klasseschoen = klasseschoen[1:]

        oberstufe = False
        if (klasseschoen+"," in jahrgaenge_oberstufe):
            oberstufe = True

        einführungsphase = False
        if (klasseschoen == jahrgang_einführung):
            einführungsphase = True

        qualiphase2 = False
        if (klasseschoen == jahrgang_abitur):
            qualiphase2 = True

        if (oberstufe==True): # Übersichtstabellen nur für Sek. I sinnvoll
            continue

        dieschueler = klassenschueler[klasse]

        allekursederklasse = {}

        # Durchlaufe alle Schüler und ermittle alle Fächer
        for derschueler in dieschueler:

            if derschueler+str(schuljahr)+str(halbjahr) in allekurse:

                kurse = allekurse[derschueler+str(schuljahr)+str(halbjahr)]

                for derkurs in kurse:
                    if derkurs[0] in allekursederklasse:
                        if allekursederklasse[derkurs[0]] == 1000:
                            allekursederklasse[derkurs[0]] = derkurs[8]   
                    else:
                        allekursederklasse[derkurs[0]] = derkurs[8]

        sorted_kurse = sorted(allekursederklasse.items(), key=lambda x:x[1])

        body += '<table>'
        body += '<tr><th class="name">'+klasseschoen+'</th>'

        body += '<th class="fehl">Fehl</th>'

        if (halbjahr==2):
            body += '<th class="versetzung">Vers</th>'    

        for derkurs in sorted_kurse:
            body += '<th>'+derkurs[0]+'</th>'

        body += '</tr>'

        # Durchlaufe alle Schüler und ermittle alle Noten

        for derschueler in dieschueler:

            data = derschueler.split('#')
            name = data[0].strip()

            if (not(derschueler+str(schuljahr)+str(halbjahr) in allekurse)):
                body += '<tr><td>'+name+'</td></tr>'

            elif (not(derschueler+str(schuljahr)+str(halbjahr) in alleabschnitte)):
                body += '<tr><td>'+name+'</td></tr>'

            else:

                kurse = allekurse[derschueler+str(schuljahr)+str(halbjahr)]

                abschnitt = alleabschnitte[derschueler+str(schuljahr)+str(halbjahr)]

                wiederholung = abschnitt[0]
                wdh_text = ""
                if (wiederholung=='J'):
                    wdh_text = " (W)"

                body += '<tr><td class="name">'+name+wdh_text+'</td>'

                fehlstunden = abschnitt[4]
                if (len(fehlstunden)==0):
                    fehlstunden = "-"

                unentschuldigt = abschnitt[5]
                if (len(unentschuldigt)==0):
                    unentschuldigt = "-"

                if (unentschuldigt=='0' or unentschuldigt=='-'):
                    ftext = fehlstunden+' / '+unentschuldigt
                else:
                    ftext = fehlstunden+' / <span class="ue">'+unentschuldigt+'</span>'

                body += '<td class="fehl">'+ftext+'</td>'

                versetzt = abschnitt[1]

                vtext = ""
                if (len(versetzt)>0):

                    if (versetzt=='V'):
                        vtext += 'V'
                    elif (versetzt=='N'):
                        vtext += '<span class="nv">NV</span>'
                    elif (versetzt=='NP'):
                        vtext += '<span class="nv">NP</span>'

                if (halbjahr==2):
                    body += '<td class="versetzung">'+vtext+'</td>'               

                for derkurs in sorted_kurse:

                    found = False

                    for meinkurs in kurse:

                        if meinkurs[0] == derkurs[0]:

                            found = True

                            note = meinkurs[3]
                            kursbez = meinkurs[0]
                            lehrer = meinkurs[1]
                            kursart = meinkurs[2]
                            mahnung = meinkurs[7]
                            
                            if (len(note)==0):
                                note = '-'
                            
                            topnoten = { '1+', '1', '1-', '2+', '2', '2-' }
                            defizite = { '5+', '5', '5-', '6' }
                            defizite_q = { '4-', '5+', '5', '5-', '6' }

                            cssklasse = ''
                            if (note in topnoten):
                                cssklasse = 'top'

                            if oberstufe:
                                if (klasse.startswith('EF')):
                                    if (note in defizite):
                                        cssklasse = 'def'
                                        if (halbjahr==2) and (mahnung=='N'):
                                            cssklasse = 'nw'
                                else:
                                    if (note in defizite_q):
                                        cssklasse = 'def'
                            else:
                                if (note in defizite):
                                    cssklasse = 'def'
                                    if (halbjahr==2) and (mahnung=='N'):
                                        cssklasse = 'nw'
                            
                            if (len(cssklasse)>0):
                                cssklasse = ' class="'+cssklasse+'"'

                            body += '<td'+cssklasse+'><span class="note">'+note+'</span>'
                            body += '</td>'

                    if (found==False):
                        body += '<td></td>'
                
                body += '</tr>'

        body += '</table>'

        body += '<pdf:nextpage />'

    return body

