import os,sys

from django.contrib.auth.decorators import login_required
from django.http import HttpResponse, HttpResponseRedirect, FileResponse
from django.shortcuts import render
from django.template import loader

from .AWK import config, routines, util
#import .forms 
from .forms import (
    EhmeldungForm, 
    VorlagenForm, 
    BeitragForm, 
    VorlagenVerwaltungForm, 
    MitgliederForm, 
    MitgliederAuswahlForm, 
    DatenfileVerwaltungForm )
from eh_app.AWK.pdf_ersteller import PdfErsteller

from mysite import settings
import time

# Create your views here.

# change working dir due to relative paths in scripts
os.chdir(settings.BASE_DIR)

try:
    home = os.environ["HOME"]
    if os.path.exists(f"{home}/.eclipse/org.eclipse.platform_4.18.0_1473617060_linux_gtk_x86_64/plugins/org.python.pydev.core_8.3.0.202104101217/pysrc/"):
        # its a eclipse development environment
        sys.path.append(f"{home}/.eclipse/org.eclipse.platform_4.18.0_1473617060_linux_gtk_x86_64/plugins/org.python.pydev.core_8.3.0.202104101217/pysrc/")
        import pydevd
        pydevd.settrace()

except:
    pass

LOGIN_URL = "/eh-app/login"

def erstelle_datenquelle_liste(data_path):
    dirlist = None
    vorlagen_liste = []
    if os.path.isdir(data_path):
        dirlist = os.listdir(data_path) # returns list
    if dirlist:
        for t in dirlist:
            vorlagen_liste.append((t,t))
    return vorlagen_liste

def erstelle_vorlagen_liste(verein):
    # Erstelle Vorlagenliste
    os.chdir(settings.BASE_DIR)
    dirlist = os.listdir()
    util.schreibe_log(str(dirlist))
    dirlist = None
    vorlagen_liste = []
    if os.path.isdir("eh_app/templates/"+verein):
        dirlist = os.listdir("eh_app/templates/"+verein) # returns list
    if dirlist:
        for t in dirlist:
            tpl_name_wo_ext = os.path.splitext(t)[0]
            vorlagen_liste.append((t,tpl_name_wo_ext))
    return vorlagen_liste

@login_required(login_url=LOGIN_URL)
def vorlagen_verwalten(request, verein):
    vorlagen_liste = erstelle_vorlagen_liste(verein)
    
    if request.method == 'POST':
        # Form auswerten
        form = VorlagenVerwaltungForm(request.POST, request.FILES, vorlagen=vorlagen_liste)
        if form.is_valid():
            zu_loschen = form.cleaned_data['vorlagen_zu_loschen']
            zu_install = request.FILES.get('vorlage_neu', None)
            routines.vorlagen_verwalten(verein, zu_loschen, zu_install)
        else:
            raise RuntimeError(f"Form not valid: {form.errors}")
        # Verarbeitung in routines.py aufrufen

        # Wenn alles gut gegangen, zurück zum Kassenbrief
        return HttpResponseRedirect(f'/eh-app/{verein}/kassenbrief')
    else:
        vorlagen_form = VorlagenVerwaltungForm(vorlagen=vorlagen_liste)
        
    template = loader.get_template("vorlagen_verwalten.html")
    return HttpResponse(template.render(
        {
            "verein" : verein, 
            "vorlagen_form" : vorlagen_form }, 
        request))

@login_required(login_url=LOGIN_URL)
def datenquelle_andern(request, verein):
    cf = config.getInstance(verein)
    data_path = cf.requireConfig("data_path")
    ehappdir  = cf.getConfig("ehappdir", "/opt/eh_app")
    vereinchecker = f"{ehappdir}/bin/ehapp-verein-check.sh"
    if not os.path.exists(vereinchecker):
        raise RuntimeError("ehapp-verein-check.sh nicht gefunden: "+vereinchecker)

    rc = os.system(f'{vereinchecker} {data_path}')
    if rc != 0:
        raise RuntimeError(f"ehapp-verein-check.sh fehlgeschlagen: {rc}")
    quellen_path = os.path.join(data_path, "quellen")
    datenquellen_liste = erstelle_datenquelle_liste(quellen_path)
    
    if request.method == 'POST':
        # Form auswerten
        form = DatenfileVerwaltungForm(
            request.POST, 
            request.FILES, 
            datenquellen=datenquellen_liste)
        if form.is_valid():
            zu_loschen   = form.cleaned_data['dateien_zu_loschen']
            zu_verwenden = form.cleaned_data['datei_verwendung']
            zu_install   = request.FILES.get('datei_neu', None)
            routines.datenquelle_andern(verein, quellen_path, zu_loschen, zu_verwenden, zu_install)
        else:
            raise RuntimeError(f"Form not valid: {form.errors}")
        # Verarbeitung in routines.py aufrufen

        # Wenn alles gut gegangen, zurück zum Kassenbrief
        letzte_seite = request.POST.get("letzte_seite")
        return HttpResponseRedirect(f'/eh-app/{verein}/{letzte_seite}')
    else:
        form = DatenfileVerwaltungForm(datenquellen=datenquellen_liste)
        
    letzte_seite = request.GET.get("letzte_seite") or ""
    template = loader.get_template("datenquelle_andern.html")
    return HttpResponse(template.render(
        {
            "verein"           : verein, 
            "datenquelle_form" : form,
            "letzte_seite"     : letzte_seite }, 
        request))

@login_required(login_url=LOGIN_URL)
def mitglieder_auswahlen(request, verein):
    mitglieder = (request.COOKIES.get('mausw2') or "").split(",")
    config.getInstance(verein) # wird in qmodel gebraucht
    from eh_app.qmodels import Mitglied
    mm = Mitglied.objects.all()
    mitglieder_liste = []
    for m in mm:
        mitglieder_liste.append((m.mitgliedsnr, m.nachname+" "+m.vorname))

    if request.method == 'POST':
        # Form auswerten
        form = MitgliederAuswahlForm(
            request.POST, 
            request.FILES, 
            mitglieder=mitglieder_liste)
        if form.is_valid():
            mg_ausw  = form.cleaned_data['mg_auswahl']
        else:
            raise RuntimeError(f"Form not valid: {form.errors}")
        
        # Wenn alles gut gegangen, zurück zum Kassenbrief
        response = HttpResponseRedirect(f'/eh-app/{verein}/kassenbrief')
        mg_ausw_str = ",".join(mg_ausw)
        response.set_cookie("mausw2", mg_ausw_str)
        return response
    else:
        mausw_form = MitgliederAuswahlForm(mitglieder=mitglieder_liste, initial={"mg_auswahl":mitglieder})
        
    template = loader.get_template("mitglieder_auswahlen.html")
    return HttpResponse(template.render(
        {
            "verein" : verein, 
            "mausw_form" : mausw_form }, 
        request))

@login_required(login_url=LOGIN_URL)
def kassenbrief(request, verein):
    '''
    GET:
    Diese Methode liest aus der Config die Einstellungen und zeigt sie an.
    
    POST: 
    Diese Methode lädt die Zusammenfassung
    
    ---------------------------------------------------------------
    Templateauswahl
    
    Ausgewähltes Template: <Wert aus Config>
    Link -> Neue Templates installieren
    ---------------------------------------------------------------
    '''
    
    mg_ausw = request.COOKIES.get('mausw1') or "leer"
    mg_zul  = request.COOKIES.get('mausw2') or "leer"
    alles_ok = True
    fehlertext_quelle  = ""
    fehlertext_vorlage = ""
    fehlertext_beitrag = ""
    vconf = config.getInstance(verein)
    datenquelle    = vconf.getConfig("datenquelle")
    beitrag_basis  = vconf.getConfig("beitrag_basis", 0)
    beitrag_zusatz = vconf.getConfig("beitrag_zusatz", 0)
    vorlagen_liste = erstelle_vorlagen_liste(verein)
    vorlage        = vconf.getConfig("vorlage", "")
    mausw_form = MitgliederForm(
        zul=mg_zul,
        initial={"mg_auswahl"  : mg_ausw,}
                 )
    if request.method == 'POST':
        # Prüfe Datenquelle
        if not datenquelle:
            fehlertext_quelle = "Datenquelle auswählen"
            alles_ok = False
        
        # Prüfe Vorlage
        vorlagen_form = VorlagenForm(request.POST, request.FILES, templates=vorlagen_liste)
        if not vorlagen_form.is_valid():
            raise RuntimeError("VorlagenForm invalid: "+str(vorlagen_form.errors))
        vorlage = vorlagen_form.cleaned_data["vorlagen"]
        if not vorlage:
            fehlertext_vorlage = "Bitte Kassenbriefvorlage auswählen"
            alles_ok = False

        # Prüfe Beiträge
        beitrag_form = BeitragForm(request.POST, request.FILES)
        if not beitrag_form.is_valid():
            raise RuntimeError("BeitragForm invalid: Formular nochmal schicken")
        beitrag_basis  = beitrag_form.cleaned_data["basisbeitrag"]
        beitrag_zusatz = beitrag_form.cleaned_data["zusatzbeitrag"]
        if beitrag_basis == 0 or beitrag_zusatz == 0:
            fehlertext_beitrag = "Beiträge ausfüllen"
            alles_ok = False

        routines.aktualisiere_config(vconf, vorlage, beitrag_form.cleaned_data)
        
        # Speichere Migliederauswahl in Cookie
        mausw_form = MitgliederForm(request.POST, request.FILES)
        if not mausw_form.is_valid():
            raise RuntimeError("MitgliederForm invalid: "+str(mausw_form.errors))
        mausw = mausw_form.cleaned_data["mg_auswahl"]
        
        
        if alles_ok:
            response = HttpResponseRedirect('zusammenfassung')
            response.set_cookie("mausw1", mausw)
            return response

    # GET request / POST mit Fehlern
    vorlagen_form = VorlagenForm(
        templates=vorlagen_liste,
        initial={'vorlagen' : vorlage } )
    beitrag_form = BeitragForm(
        initial={
            "basisbeitrag"  : beitrag_basis,
            "zusatzbeitrag" : beitrag_zusatz,
    })
    return render(request, 'kassenbrief.html', {
        "datenquelle"  : datenquelle or "Keine Datenquelle ausgewählt",
        'vorlagen_form': vorlagen_form, 
        'beitrag_form' : beitrag_form, 
        'mausw_form'   : mausw_form, 
        'verein'       : verein,
        'fehler_quelle': fehlertext_quelle
    })

@login_required(login_url=LOGIN_URL)
def kassenbrief_zusammenfassung(request, verein):
    vconf = config.getInstance(verein)
    datenquelle    = vconf.getConfig("datenquelle")
    beitrag_basis  = vconf.getConfig("beitrag_basis", 0)
    beitrag_zusatz = vconf.getConfig("beitrag_zusatz", 0)
    vorlage        = vconf.getConfig("vorlage")
    mitglieder     = request.COOKIES.get('mausw1')
    if mitglieder == "zul":
        mitglieder = request.COOKIES.get('mausw2')
    if request.method == 'POST':
        post = request.POST
        if "erstellen" in post:
            data_path  = vconf.getConfig("data_path", "/var/ehapp")
            build_name = time.strftime("%Y%m%d%H%M%S", time.localtime())

            anzahl, gesamtbetrag = routines.pdfs_erstellen(request, verein, mitglieder, vorlage, data_path, build_name)
            response = HttpResponseRedirect(f'/eh-app/{verein}/kassenbrief/erfolg')
            response.set_cookie("build_name", build_name)
            response.set_cookie("anzahl", anzahl)
            response.set_cookie("gesamtbetrag", gesamtbetrag)
            return response
        else:
            return HttpResponseRedirect(f'/eh-app/{verein}/kassenbrief')
        
    else:
        tpl_name_wo_ext = os.path.splitext(vorlage)[0]
        return render(request, 'kassenbrief_zusammenfassung.html', {
            'verein'        : verein,
            'datenquelle'   : datenquelle,
            'vorlage'       : tpl_name_wo_ext,
            'basisbeitrag'  : beitrag_basis,
            'zusatzbeitrag' : beitrag_zusatz,
            'miglieder'     : mitglieder        })

@login_required(login_url=LOGIN_URL)
def kassenbrief_erfolg(request, verein):
    return render(request, 'kassenbrief_erfolg.html', {
            'verein'       : verein,
            'anzahl'       : request.COOKIES.get('anzahl'),
            'gesamtbetrag' : request.COOKIES.get('gesamtbetrag'),
        })

@login_required(login_url=LOGIN_URL)
def kassenbrief_download(request, verein):
    vconf = config.getInstance(verein)
    data_path  = vconf.getConfig("data_path", "/var/ehapp")
    build_name = request.COOKIES.get('build_name')
    
    ergebnis_datei = os.path.join(data_path, "build", build_name, "ergebnis.tgz")

    response = FileResponse(open(ergebnis_datei, 'rb'), as_attachment=True, filename=f"{build_name}.tgz")
    return response

@login_required(login_url=LOGIN_URL)
def ehmeldung(request, verein):
    # if this is a POST request we need to process the form data
    if request.method == 'POST':
        # create a form instance and populate it with data from the request:
        form = EhmeldungForm(request.POST, request.FILES)
        # check whether it's valid:
        if form.is_valid():
            # bei Änderungen Konfiguration aktualisieren
            routines.erstelle_ehmeldung(form.cleaned_data)
            routines.erstelle_ausweis(form.cleaned_data)
            # redirect to a new URL:
            return HttpResponseRedirect('/thanks/')

    # if a GET (or any other method) we'll create a blank form
    else:
        form = EhmeldungForm()

    return render(request, 'ehmeldung.html', {'form': form, 'verein': verein})

@login_required(login_url=LOGIN_URL)
def vertragsliste(request, verein):
    vconf = config.getInstance(verein)
    data_path  = vconf.getConfig("data_path", "/var/ehapp")
    ergebnis_datei = routines.vertragsliste_erstellen(verein, data_path)
    response = FileResponse(open(os.path.join(data_path, "build",ergebnis_datei), 'rb'), as_attachment=True, filename=ergebnis_datei)
    return response

def index(request, verein):
    if request.user.is_authenticated:
        print("index login ok")
    else:
        print("index not logged in")

    datenquelle = config.getInstance(verein).getConfig("datenquelle")

    template = loader.get_template('eh_app.html')
    response = HttpResponse(template.render(
        {"verein"      : verein,
         "verein_name" : verein,
         "datenquelle" : datenquelle,
        }, request))
    return response    

def login(request):
    from django.contrib import auth
    from .forms import LoginForm

    fehlertext = ""
    # if this is a POST request we need to process the form data
    if request.method == 'POST':
        # create a form instance and populate it with data from the request:
        form = LoginForm(request.POST, request.FILES)
        # check whether it's valid:
        if form.is_valid():
            user = auth.authenticate(
                username = request.POST["name"], 
                password = request.POST["password"],
            )
            verein = request.POST["verein"]
        if user is not None:
            
            # check group
            for group in user.groups.all():
                if group.name == verein:
                    auth.login(request, user)
                    if request.user.is_authenticated:
                        print("auth login ok")
                    else:
                        print("auth not logged in")
                    next = request.POST.get("next", None)
                    if next:
                        return HttpResponseRedirect(next)
                    else:
                        return HttpResponseRedirect(f'/eh-app/{verein}')
        # login fehlgeschlagen
        fehlertext = "Login fehlgeschlagen"

    # if a GET (or any other method) we'll create a blank form
    else:
        next   = None
        verein = ""
        next = request.GET.get("next", None)
        if next:
            path_elems = next.split("/")
            verein = path_elems[2]
        form = LoginForm(initial={'next': next, 'verein': verein})

    return render(request, 'login.html', {'form': form, 'fehlertext': fehlertext})
    