import os
import time

from eh_app.AWK import config

'''
def handle_uploaded_file(csv_file):
    csv_file_name = str(csv_file)
    data_path = config.getInstance().requireConfig("data_path")
    path = os.path.join(data_path, csv_file_name)
    with open(path, 'wb+') as destination:
        for chunk in csv_file.chunks():
            destination.write(chunk)
'''
from django.utils.datetime_safe import strftime
def aktualisiere_config(config, vorlage, beitrag_data):
    '''
    if file:
        uploaded_file = file.name
        data_path = config.requireConfig("data_path")
        # copy briefpapier into data_path
        with open(os.path.join(data_path, uploaded_file), 'wb+') as destination:
            for chunk in file.chunks():
                destination.write(chunk)
        config.setConfig("briefpapier", uploaded_file)
    '''
    if vorlage:
        config.setConfig("vorlage", vorlage)
    if beitrag_data["basisbeitrag"]:
        config.setConfig("beitrag_basis", beitrag_data["basisbeitrag"])

    if beitrag_data["zusatzbeitrag"]:
        config.setConfig("beitrag_zusatz", beitrag_data["zusatzbeitrag"])
    
def erstelle_ehmeldung(data, verein):
    from PyPDF2 import PdfFileWriter, PdfFileReader
    from datetime import date
    import io
    from reportlab.pdfgen import canvas
    from reportlab.lib.pagesizes import letter
   
    packet = io.BytesIO()
    can = canvas.Canvas(packet, pagesize=letter)
    
    # Adressfeld
    can.setFont("Helvetica", 14)
    can.drawString(80, 770, "Siedlervereinigung Berg am Laim")
    can.setFont("Helvetica", 12)
    can.drawString(285, 705, data["Eintrittsdatum"])
    can.drawString(205, 685, "Siedlervereinigung Berg am Laim")
    can.drawString(205, 618, data["VorZuname"])
    can.drawString(205, 600, data["VorZunamePartner"])
    can.drawString(205, 583, data["Wohnanschrift"])
    can.drawString(205, 566, data["Telefon"])
    can.drawString(365, 566, data["Email"])
    can.drawString(205, 549, data["Geburtsdatum"])
    versichertes_object = data["VersichertesObjekt"]
    if versichertes_object == "":
        versichertes_object = data["Wohnanschrift"]
    can.drawString(205, 500, versichertes_object)
    can.drawString(193, 466, str(data["AnzahlWohnungen"]))
    if data["Selbstgenutzt"]:
        can.drawString(360, 466, "X")
    if data["Eigentumswohnung"]:
        can.drawString(192, 449, "X")
    if data["Gewerblich"]:
        can.drawString(360, 449, "X")
    can.drawString(140, 376, date.today().strftime('%d.%m.%Y'))
    can.drawString(350, 376, "Maschinell erstellt.")
        
    can.save()
    
    #move to the beginning of the StringIO buffer
    packet.seek(0)
    
    # Dateipfade
    pfad = config.getInstance(verein).requireConfig("data_path")
    
    # create a new PDF with Reportlab
    new_pdf = PdfFileReader(packet)
    # read your existing PDF
    existing_pdf = PdfFileReader(open(os.path.join(pfad, "upload", "BeitrittserklarungSVBaL.pdf"), "rb"))
    output = PdfFileWriter()
    # add the "watermark" (which is the new pdf) on the existing page
    page = existing_pdf.pages[0]
    page.mergePage(new_pdf.pages[0])
    output.addPage(page)
    # finally, write "output" to a real file
    output_stream = open(os.path.join(pfad, "build","meldung.pdf"), "wb")
    output.write(output_stream)
    output_stream.close()

def erstelle_ausweis(data, verein):
    from PyPDF2 import PdfFileWriter, PdfFileReader
    from datetime import date
    import io
    from reportlab.pdfgen import canvas
    from reportlab.lib.pagesizes import letter

    cf = config.getInstance(verein)
    workdir   = cf.requireConfig("data_path")
    #build_path  = os.path.join(workdir, "build")
    #upload_path = os.path.join(workdir, "upload")
    
    packet = io.BytesIO()
    can = canvas.Canvas(packet, pagesize=letter)
    
    # Adressfeld
    can.setFont("Helvetica", 12)
    can.drawString(70, 640, "Herr/Frau")
    can.drawString(70, 625, data["VorZuname"])
    can.drawString(70, 610, data["Wohnanschrift"])
    #can.drawString(70, 590, "PLZ/Ort")

    # Datum
    can.setFont("Helvetica", 9)
    can.drawString(350, 520, "München, "+date.today().strftime('%d.%m.%Y'))
    
    # Anschreiben
    can.drawString(70, 500, "Sehr geehrte/r Herr/Frau "+data["VorZuname"]+",")
    text = can.beginText(70, 480)
    text.textLines("wir freuen uns, dass Sie der Siedlervereinigung Berg am Laim beigetreten sind.")
    text.textLines("Im unteren Teil befindet sich Ihr Mitgliedsausweis.")
    text.textLines(" ")
    text.textLines("Viele Grüße")
    text.textLines("Michael Wagner (Vorstand)")
    can.drawText(text)
    
    
    can.line(20, 180, 560, 180)
    
    # Ausweis
    can.setFont("Helvetica", 12)
    can.drawString(460, 100, "#0817654")
    can.drawString(330, 80, data["VorZuname"])
    can.setFont("Helvetica", 9)
    can.drawString(400, 56, data["Geburtsdatum"])
    can.drawString(400, 42, data["Eintrittsdatum"])
    versichertes_object = data["VersichertesObjekt"]
    if versichertes_object == "":
        versichertes_object = data["Wohnanschrift"]
    can.drawString(400, 20, versichertes_object)
    
    can.save()
    
    #move to the beginning of the StringIO buffer
    packet.seek(0)
    
    # create a new PDF with Reportlab
    new_pdf = PdfFileReader(packet)
    # read your existing PDF
    existing_pdf = PdfFileReader(open(os.path.join(workdir, "upload", "MitgliederausweisSVBaLVorlage_leer.pdf"), "rb"))
    output = PdfFileWriter()
    # add the "watermark" (which is the new pdf) on the existing page
    page = existing_pdf.pages[0]
    page.mergePage(new_pdf.pages[0])
    output.addPage(page)
    # finally, write "output" to a real file
    output_stream = open(os.path.join(workdir, "build", "ausweis.pdf"), "wb")
    output.write(output_stream)
    output_stream.close()
      
def pdfs_erstellen(request, verein, mitglieder, templ_name, data_path, build_name):
    from django.template import loader
    
    # lese alle Miglieder
    from eh_app.qmodels import Mitglied
    if mitglieder == "alle":
        mm = Mitglied.objects.all()
    else:
        mm = []
        m_ids = mitglieder.split(",")
        for m_id in m_ids:
            o = Mitglied.objects
            m = o.get(mitgliedsnr=m_id)
            if not m:
                raise RuntimeError(f"Mitglied mit id {m_id} konnte nicht geladen werden.")
            mm.append(m)
    template = loader.get_template(f"{verein}/{templ_name}")

    cf = config.getInstance()
    ehappdir  = cf.getConfig("ehappdir", "/opt/eh_app")
    pdfersteller = f"{ehappdir}/bin/pdfersteller.sh"
    if not os.path.exists(pdfersteller):
        raise RuntimeError("Install-Skript nicht gefunden: "+pdfersteller)
    
    from eh_app.AWK.pdf_ersteller import PdfErsteller
    build_base      = os.path.join(data_path, "build")
    build_path      = os.path.join(build_base, build_name)
    result_path     = os.path.join(build_path, "ergebnis")
    tpl_name_wo_ext = os.path.splitext(templ_name)[0]
    template_path   = os.path.join(data_path, f"{tpl_name_wo_ext}")

    # alte builds löschen
    rc = os.system(f'cd {build_base}; rm -r *')
    if rc != 0:
        from eh_app.AWK import util
        util.schreibe_log(f"Löschen alter builds fehlgeschlagen: {rc}")
    
    # lege Verzeichnis + Links auf Templatedateien an
    os.makedirs(result_path)
    rc = os.system(f'cd {build_path}; ln -s {template_path}/* .')
    if rc != 0:
        raise RuntimeError(f"Linkerstellung fehlgeschlagen: {rc}")
    
    basisbtr  = int(cf.requireConfig("beitrag_basis"))
    zusatzbtr = int(cf.requireConfig("beitrag_zusatz"))

    with PdfErsteller(request, template, basisbtr, zusatzbtr, build_path, pdfersteller) as pe:
    
        # Erstelle PDFs
        for m in mm:
            rc = pe.erstellepdf(m)
            if rc != 0:
                return rc,0,0
    
    # Ergebnis packen
    rc = os.system(f'cd {build_path}; tar czf ergebnis.tgz ergebnis')
    if rc != 0:
        raise RuntimeError(f"Packen (tar) fehlgeschlagen: {rc}")
    
    return 0, pe.anzahl, pe.gesamtbetrag
    
def vertragsliste_erstellen(verein, data_path):
    build_path     = os.path.join(data_path, "build")
    ergebnis_datei = "vertragsliste_"+time.strftime("%Y%m%d%H%M%S", time.localtime())+".csv"

    # lese alle Miglieder
    from eh_app.qmodels import Mitglied
    mm = Mitglied.objects.all()
    
    with open(os.path.join(build_path,ergebnis_datei), "w") as d:
        print("Name", "Vorname", "Straße", "PLZ", "Ort", "Grundstück", "Eintrittsdatum", sep=";", file=d )
        for m in mm:
            gg = m.VersicherteGrundstucke()
            for g in gg:
                print(m.nachname, 
                      m.vorname, 
                      m.strasse, 
                      m.plz, 
                      m.ort, 
                      g, 
                      m.eintrittsdatum.strftime("%d.%m.%Y"), 
                      sep=";", file=d )
    return ergebnis_datei

def vorlagen_verwalten(verein, zu_loschen, vorlage_neu):
    import subprocess
    cf = config.getInstance(verein)
    ehappdir  = cf.getConfig("ehappdir", "/opt/eh_app")
    workdir   = cf.getConfig("data_path", "/var/mysite/eh_app")
    djangodir = cf.getConfig("djangodir", "/opt/mysite")
    install_sh  = f"{ehappdir}/bin/install_vorlage.sh"
    delete_sh   = f"{ehappdir}/bin/delete_vorlage.sh"
    ehapp_check = f"{ehappdir}/bin/ehapp-verein-check.sh"
    
    # prüfe Existenz der Skripte
    if not os.path.exists(install_sh):
        raise RuntimeError("Install-Skript nicht gefunden: "+install_sh)
    if not os.path.exists(delete_sh):
        raise RuntimeError("Delete-Skript nicht gefunden: "+delete_sh)
    if not os.path.exists(ehapp_check):
        raise RuntimeError("Check-Skript nicht gefunden: "+ehapp_check)
    
    # prüfe Dateistruktur
    rc = subprocess.call(["bash", ehapp_check, workdir, verein])
    if rc != 0:
        raise RuntimeError(f"install_sh failed: {rc}")
    
    
    for vorlage in zu_loschen:
        rc = os.system(f'{delete_sh} {verein} {vorlage} {ehappdir}')
        if rc != 0:
            raise RuntimeError(f"delete_sh fehlgeschlagen: {rc}")
    if vorlage_neu:
        vorlage_name = str(vorlage_neu)
        path = os.path.join(workdir, "upload", vorlage_name)
        with open(path, 'wb+') as destination:
            for chunk in vorlage_neu.chunks():
                destination.write(chunk)
        #raise RuntimeError(f"xxxxxxxx: {install_sh} {verein} {vorlage_name} {workdir} {ehappdir}")
        rc = subprocess.call(["bash", install_sh, verein,  vorlage_name, workdir, ehappdir])
        if rc != 0:
            raise RuntimeError(f"install_sh failed: {rc}")

def datenquelle_andern(verein, pfad, zu_loschen, zu_verwenden, zu_install):
    cf         = config.getInstance(verein)
    akt_quelle = cf.getConfig("datenquelle", "")
    
    # Dateien löschen
    for file in zu_loschen:
        dpath = os.path.join(pfad, file)
        os.unlink(dpath)
        if akt_quelle == file:
            # Datenquelle zurücksetzen
            cf.setConfig("datenquelle")
    
    # Neue Datei verwenden
    if zu_install:
        datei_name = str(zu_install)
        dpath = os.path.join(pfad, datei_name)
        with open(dpath, 'wb+') as destination:
            for chunk in zu_install.chunks():
                destination.write(chunk)
        cf.setConfig("datenquelle", datei_name)
    elif zu_verwenden:
        cf.setConfig("datenquelle", zu_verwenden)
