'''
Created on 04.12.2024

@author: sparky2021
'''
from q import QError
from qif import QIF
from .AWK import config
import datetime
from django.utils.decorators import classproperty
import os

def create_mitglied_from_dataset(data):
    eintrittsdatum = datetime.datetime.strptime(data[8], '%d.%m.%Y')
    if eintrittsdatum > datetime.datetime.today():
        return None
    if data[9] != "":
        austrittsdatum = datetime.datetime.strptime(data[9], '%d.%m.%Y')
        if austrittsdatum < datetime.datetime.today():
            return None
    m = Mitglied()
    m.eintrittsdatum = eintrittsdatum
    m.mitgliedsnr    = data[0]
    m.anrede = data[1]
    m.vorname = data[2]
    m.nachname = data[3]
    m.strasse  = data[4]
    # "Zusatzadresse"
    m.plz      = data[5]
    m.ort      = data[6]
    
    # "Land"
    # "Titel"
    # "Geschlecht"
    # "Familienstand"
    # m.geburtsdatum   = data[7]
    # "Austrittsgrund"
    # m.zahlungsart    = data[16]
    m.iban           = data[11]
    # m.bic            = data[18]
    # "Kontonummer"
    # "Bankleitzahl"
    # "Kreditinstitut"
    # m.kontoinhaber   = data[22]
    # m.mandatsreferenz = data[23]
    # m.debitorenkontonr = data[24]
    # m.status           = data[25]
    # "Branche"
    # "Notfallnummer"
    # "Notfallkontakt"
    # m.email            = data[29] # "KommE-Mail_P1"
    # "KommFax_P1"
    # "KommMobil_P1"
    # "KommWeb_P1"
    # "KommTelefon_P1"
    # "KommSkype_P1"
    # m.abteilung_1      = data[35]
    # m.abteilungseintritt_1 = data[36]
    # m.abteilungsaustritt_1 = data[37]
    # if data[67] == '""':
    #     m.stammnummer = 0
    # else:
    #     m.stammnummer       = int(m.rd_opt_qval(data[67]))
    # "Freifeldname_2"
    # m.ver_grund           = m.rd_opt_qval(data[69])
    # if len(m.ver_grund) == 0:
    #     m.ver_grund = f"{m.strasse}, {m.plz} {m.ort}"
    # "Freifeldname_3"
    # m.zeitung             = data[71]
    return m
    
class MitgliederQuery:
    def __init__(self):
        self.data_source = QIF({"d" : ";", "H" : 1})
        '''
            d (separator)  : ;
            H (header line): yes
        '''
        #cf = config.getInstance()
        #self.file_name = os.path.join(cf.requireConfig("data_path"), "quellen", cf.requireConfig("datenquelle"))
        self.file_name = "undefined. Set by .init(verein)"
        self.att_list = "MitgliedschaftsNr, Mitgliedschaftsanrede, Vorname1, Nachname1, Strasse1, Plz1, Ort1, Geburtsdatum1, EintrittVerein, AustrittVerein, Zahlungsart, IBAN, BIC, Kontoinhaber, MandatsReferenz, Email"
        #self.att_list = "Mitgliedschaftsanrede, Vorname1, Nachname1, Strasse1, Plz1, Ort1, Geburtsdatum1, EintrittVerein, AustrittVerein, Zahlungsart, IBAN, BIC, Kontoinhaber, MandatsReferenz, Email"
        #                 0              1       2        3          4        5    6    7             8               9               10           11    12   13            14     15         16              17
        cf = config.getInstance()
        self.file_name = os.path.join(cf.requireConfig("data_path"), "quellen", cf.requireConfig("datenquelle"))
        
    def all(self):
        data_set = self.data_source.request(f"SELECT {self.att_list} FROM {self.file_name} ORDER BY Nachname1, Vorname1")
        if type(data_set) is QError:
            raise RuntimeError(data_set)
        mm = []
        for data in data_set:
            m = create_mitglied_from_dataset(data)
            if m:
                mm.append(m)
        return mm
    
    def get(self, mitgliedsnr):
        data_set = self.data_source.request(f"SELECT {self.att_list} FROM {self.file_name} WHERE MitgliedschaftsNr = {mitgliedsnr}")
        if type(data_set) is QError:
            raise RuntimeError(data_set)
        if data_set[0]:
            return create_mitglied_from_dataset(data_set[0])
        return None
    
    def VersicherteGrundstucke(self, mitglied):
        # Hole Basiseintrag

        data_set = self.data_source.request(f"SELECT Objekt FROM {self.file_name} WHERE MitgliedschaftsNr = {mitglied.mitgliedsnr}")
        if type(data_set) is QError:
            raise RuntimeError(data_set)
        if data_set[0][0]:
            gr = data_set[0][0]
        else:
            gr = f"{mitglied.strasse}, {mitglied.plz} {mitglied.ort}"
        gst = [gr]
        
        # Suche nach weiteren Grunstücken
        data_set = self.data_source.request(f"SELECT `Weiteres Grundstück 1` FROM {self.file_name} WHERE MitgliedschaftsNr = {mitglied.mitgliedsnr}")
        if type(data_set) is QError:
            raise RuntimeError(data_set)
        if data_set[0][0] != "":
            gst.append(data_set[0][0])
                
        data_set = self.data_source.request(f"SELECT `Weiteres Grundstück 2` FROM {self.file_name} WHERE MitgliedschaftsNr = {mitglied.mitgliedsnr}")
        if type(data_set) is QError:
            raise RuntimeError(data_set)
        if data_set[0][0] != "":
            gst.append(data_set[0][0])
                
        data_set = self.data_source.request(f"SELECT `Weiteres Grundstück 3` FROM {self.file_name} WHERE MitgliedschaftsNr = {mitglied.mitgliedsnr}")
        if type(data_set) is QError:
            raise RuntimeError(data_set)
        if data_set[0][0] != "":
            gst.append(data_set[0][0])
                
        return gst
class classproperty(object):
    def __init__(self, f):
        self.f = f
    def __get__(self, obj, owner):
        return self.f(owner)
     
class Mitglied:
    #def objects = MitgliederQuery()
    _objects = None
    @classproperty
    def objects(cls):
        if not cls._objects:
            cls._objects = MitgliederQuery()
            ############################ Hack #########################
            #cls._objects.init("svbal")
        return cls._objects
        
    
    #@property : nette Idee, funktioniert aber nicht auf Klassenebene
    '''
    def objects():
        if not _objects:
            _objects = MitgliederQuery()
        print ("xxxxxxxxxxxxxxxxxxxxxxtype _objects",type(_objects))
        return _objects
    '''
    def __init__(self):
        pass
    
    def VersicherteGrundstucke(self):
        return self.objects.VersicherteGrundstucke(self)
