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):
    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(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)
    
    # create a new PDF with Reportlab
    new_pdf = PdfFileReader(packet)
    # read your existing PDF
    existing_pdf = PdfFileReader(open("/home/sparky2021/SVBaL/Aktuell/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("meldung.pdf", "wb")
    output.write(output_stream)
    output_stream.close()

def erstelle_ausweis(data):
    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", 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("Hier Ihr Ausweis")
    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, date.today().strftime('%d.%m.%Y'))
    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("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("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:
            pe.erstellepdf(m)
    
    # 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 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)
