#!python3

import os, glob, sys
import argparse, csv

from configparser import ConfigParser
from xhtml2pdf import pisa

sys.path.append(os.path.abspath("./pages"))
import start, halbjahr, birthday, uebersicht, korrektur, somi, ha, checkliste


# 1. Eingabepfad einlesen aus lehrerpdf.ini oder bevorzugt: mylehrerpdf.ini
base_file = "mylehrerpdf.ini"
if (not(os.path.exists(base_file))):
    base_file = "lehrerpdf.ini"

if (not(os.path.exists(base_file))):
    print(base_file+" nicht vorhanden!")
    exit(0)

base = ConfigParser(allow_no_value=True)
base.read(base_file)

try:
    path = base["Allgemein"]["pfad"] # Basispfad
except KeyError:
    print('Der Schlüssel Allgemein oder "pfad" existiert nicht in der Config-Datei!')
    exit(0)
if (not(os.path.exists(path))):
    print("Basisverzeichnis "+path+" nicht vorhanden!")
    exit(0)

print("Verarbeite das Verzeichnis: "+path)


# 2. Konfiguration des Benutzers einlesen
inputs_file = path+"input.ini"
if (not(os.path.exists(inputs_file))):
    print(inputs_file+" nicht vorhanden!")
    exit(0)
inputs = ConfigParser()
inputs.read(inputs_file) 


# 3. Konfiguration des Zielgeräts einlesen
try:
    device = inputs["Allgemein"]["device"]
except KeyError:
    print('Der Schlüssel Allgemein oder "device" existiert nicht in der Input-Datei!')
    exit(0)

try:
    rand = inputs["Allgemein"]["rand"]
except KeyError:
    print('Der Schlüssel Allgemein oder "rand" existiert nicht in der Input-Datei!')
    exit(0)

# Basiskonfiguration für das Device einlesen
ini_file = 'devices/'+device+'.ini'
if (not(os.path.exists(ini_file))):
    print(ini_file+" nicht vorhanden!")
    exit(0)
config = ConfigParser(allow_no_value=True)
config.read(ini_file)

# CSS Formatierung für das Device einlesen
if (len(rand)>0):
    myrand = "-"+rand
else:
    myrand = ""

css_devicefile = 'devices/'+device+myrand+'.css'
if (not(os.path.exists(css_devicefile))):
    if (len(rand)>0):
        print(css_devicefile+" (mit Rand) nicht vorhanden, verwende CSS ohne Rand.")
        css_devicefile = 'devices/'+device+'.css'
        if (not(os.path.exists(css_devicefile))):
            print(css_devicefile+" nicht vorhanden!")
            exit(0)
    else: 
        print(css_devicefile+" nicht vorhanden!")
        exit(0)


# 4. Vorbereitungen für Verarbeitung

# Lerngruppen aus Eingabedateien ermitteln
dateien = glob.glob(path+'*.csv')
dateien.sort()

lerngruppen = []
for lerngruppe in dateien:
    dateiname = lerngruppe.replace(path,"")
    gruppenid = dateiname.replace(".csv","")
    lerngruppen.append(gruppenid)

# Wichtige Schlüssel einlesen
try:
    csv_info = inputs["Allgemein"]
except KeyError:
    print("Der Schlüssel Allgemein existiert nicht in der Input-Datei!")
    exit(0)

try:
    sj_test = csv_info["schuljahr"]
    hj_test = csv_info["halbjahr"]
except KeyError:
    print("Schuljahr oder Halbjahr existiert nicht im algemeinen Teil der Input-Datei!")
    exit(0)

try:
    csv_trenner = csv_info["csvtrenner"]
except KeyError:
    print('Der Schlüssel "csvtrenner" existiert nicht im allgemeinen Bereich der Input-Datei!')
    exit(0)

try:
    namen_kurzlang = config["Namen"]["form"]
except KeyError:
    print('Der Schlüssel Namen oder "form" existiert nicht in der Device-Datei!')
    exit(0)


# 5. Baue die Ausgabe aus den einzelnen Bestandteilen zusammen

body = ''

# Startseite einbinden
body = body + start.erstelleStartseite(lerngruppen, path, config, inputs)

# Verarbeite nacheinander alle Eingabedateien = Lerngruppen
for datei in dateien:

    print("Verarbeite Datei: "+datei)

    if (not(os.path.exists(datei))):
        print("Datei "+datei+" nicht vorhanden!")
        exit(0)

    # Implizite Konfiguration der aktuellen Lerngruppe aus Benutzerconfig auslesen
    dateiname = datei.replace(path,"")
    kursid = dateiname.replace(".csv","")

    try:
        kurs_inputs = inputs[kursid] 
    except KeyError:
        print('Der Bereichsschlüssel "'+kursid+'" (zur entsprechenden Datei) existiert nicht in der Input-Datei (1)!')
        exit(0)

    try:
        klassekurs_name = kurs_inputs["bezeichnung"]
    except KeyError:
        print('Der Schlüssel "bezeichnung" fehlt im Bereich "'+kursid+'" der Input-Datei!')
        exit(0)

    # CSV Datei mit Schülernamen einlesen und aufbereiten
    csvdaten = open(datei, encoding="utf8")
    csvdatenReader = csv.reader(csvdaten, delimiter=csv_trenner)

    linecount = 0
    namen = []
    namen2 = []
    gebdaten = []
    gebdaten_all = True

    for row in csvdatenReader:

        linecount = linecount +1

        if linecount>1: # Ignoriere Header
            
            nachname = row[0]
            vorname = row[1]

            if (namen_kurzlang=="lang"):
                name = nachname + ", " +vorname
            else:
                name = vorname + " " + nachname[0] + "."
                name2 = vorname + " " + nachname
                namen2.append(name2)

            namen.append(name)
            
            if (gebdaten_all):
                try:
                    gebdatum = row[2]
                    gebdaten.append(gebdatum)
                except IndexError:
                    print(' - Einträge für Geburtstag fehlen für Lerngruppe "'+kursid+'"!')
                    gebdaten = []
                    gebdaten_all = False
            
    # Übersichtsseite Noten zusammenbauen
    body = body + uebersicht.erstelleUebersicht(kursid, klassekurs_name, lerngruppen, path, namen, gebdaten, config, inputs, kurs_inputs)
    
    # optional: Korrekturbögen zusammenbauen
    try:
        schr_anzahl = int(kurs_inputs["schriftlich_anzahl"])
    except KeyError:
        print('Der Schlüssel "schr_anzahl" fehlt im Bereich "'+kursid+'" der Input-Datei!')
        exit(0)
    if (schr_anzahl>0):
        body = body + korrektur.erstelleKorrekturbogen(kursid, klassekurs_name, lerngruppen, path, namen, gebdaten, config, inputs, kurs_inputs)

    # SoMi-Bogen zusammenbauen
    body = body + somi.erstelleSoMiBogen(kursid, klassekurs_name, lerngruppen, path, namen, gebdaten, config, inputs, kurs_inputs)

    # optional: HA-Bogen zusammenbauen
    try:
        ha_zeilen = int(kurs_inputs["ha_zeilen"])
    except KeyError:
        print('Der Schlüssel "ha_zeilen" fehlt im Bereich "'+kursid+'" der Input-Datei!')
        exit(0)
    if (ha_zeilen>0):
        body = body + ha.erstelleHABogen(kursid, klassekurs_name, lerngruppen, path, namen, gebdaten, config, inputs, kurs_inputs)

    # Checkliste(n) zusammenbauen
    body = body + checkliste.erstelleCheckliste(kursid, klassekurs_name, lerngruppen, path, namen, gebdaten, config, inputs, kurs_inputs)

    # Geburtstagsseite zusammenbauen
    if (len(gebdaten)==0):
        print(' - Geburtstagsliste wird weggelassen.')
    else:
        if (namen_kurzlang=="lang"):
            body = body + birthday.erstelleGeburtstagsBogen(kursid, klassekurs_name, lerngruppen, path, namen, gebdaten, config, inputs, kurs_inputs)
        else:
            body = body + birthday.erstelleGeburtstagsBogen(kursid, klassekurs_name, lerngruppen, path, namen2, gebdaten, config, inputs, kurs_inputs)

    # Planungsseite für das Halbjahr zusammenbauen
    body = body + halbjahr.erstelleHalbjahresuebersicht(kursid, klassekurs_name, lerngruppen, path, namen, gebdaten, config, inputs, kurs_inputs)


# 6. Abschluss: PDF Generierung
html_source = '<html><head>'
html_source += '<link rel="stylesheet" href="'+css_devicefile+'">'
html_source += '</head><body>'+body+'</body></html>'

pisa.showLogging()

datei_ausgabe = path + device + '.pdf'
print("Erzeuge PDF-Datei: " + device + '.pdf')

with open(datei_ausgabe, "w+b") as result_file:

    # convert HTML to PDF
    pisa_status = pisa.CreatePDF(
        html_source,       # page data
        dest=result_file,  # destination file
    )

    # Check for errors
    if pisa_status.err:
        print("Fehler bei der Erzeugung der PDF aus HTML!")

print("Fertig!")
