



import os
import re
import csv
import psycopg2
from datetime import datetime

# 1. DATENBANK-VERBINDUNG EINRICHTEN
DB_CONFIG = {
"host"     : "kh122999-001.eu.clouddb.ovh.net",
"port"     : "35442",
"dbname"   : "stolperclean_prod",
"user"     : "stolperstein",
"password" : "vdAS6znXPRR"
}


# 2. VORBEREITUNG: REPARATUR VON SCHREIBFEHLERN IM TEXT
def clean_raw_text_errors(text):
    if not text:
        return ""
    # Repariert Leerzeichen in Daten (z.B. "7 .7.1884" -> "7.7.1884")
    text = re.sub(r'(\d)\s+\.\s*(\d)', r'\1.\2', text)
    text = re.sub(r'(\d)\s*\.\s+(\d)', r'\1.\2', text)
    # Repariert getrennte Jahreszahlen (z.B. "187 7" -> "1877")
    text = re.sub(r'(\d{3})\s+(\d)\b', r'\1\2', text)
    return text

# 3. PARSING FÜR DIE BIOGRAFIEN (MIT UND OHNE KOMMA)
def parse_biography_ultimate(text):
    if not text:
        return None, None, None, None, None, None, None
    
    text = clean_raw_text_errors(text)
    
    nachname, vorname, geburtsname, geb_datum, geb_ort = None, None, None, None, None
    deportations_datum, deportations_ziel = None, None

    # Namens-Extraktion mit oder ohne Komma
    if "," in text and text.find(",") < text.find("geb.") if "geb." in text else True and not re.search(r'^\d', text.split(",")[0]):
        # Normaler Fall: Trennung am Komma
        parts = [p.strip() for p in text.split(",", 1)]
        nachname = parts[0]
        rest = parts[1] if len(parts) > 1 else ""
    else:
        # Sonderfall: Kein Komma vorhanden (z.B. "Broh Louis Ludwig geb. 17.11.1874")
        name_end = len(text)
        geb_idx = text.find("geb.")
        if geb_idx != -1:
            name_end = min(name_end, geb_idx)
        digit_match = re.search(r'\d', text)
        if digit_match:
            name_end = min(name_end, digit_match.start())
            
        full_name = re.sub(r'[,;\.\s]+$', '', text[:name_end]).strip()
        
        # Splitten am ersten Leerzeichen: Erstes Wort = Nachname, Rest = Vorname
        name_parts = full_name.split(" ", 1)
        nachname = name_parts[0]
        rest = name_parts[1] if len(name_parts) > 1 else ""
    
    # Vornamen aus dem verbleibenden "Rest" isolieren
    first_name_end = len(rest)
    geb_idx = rest.find("geb.")
    if geb_idx != -1:
        first_name_end = min(first_name_end, geb_idx)
    digit_match = re.search(r'\d', rest)
    if digit_match:
        first_name_end = min(first_name_end, digit_match.start())
    vorname = re.sub(r'[,;\.\s]+$', '', rest[:first_name_end]).strip()
    
    # Geburtsname (Mädchenname) filtern
    geb_matches = re.findall(r'geb\.\s*([a-zA-ZäöüÄÖÜß]+)', text)
    for g in geb_matches:
        g_clean = g.strip()
        if g_clean not in ["in", "Deport", "Deportation"] and not re.match(r'^\d', g_clean):
            geburtsname = g_clean
            break

    # Alle Daten einlesen und chronologisch sortieren
    found_dates = []
    date_strings = re.findall(r"(\d{1,2}\.\d{1,2}\.\d{4})", text)
    for ds in date_strings:
        try:
            parsed_dt = datetime.strptime(ds, "%d.%m.%Y").date()
            found_dates.append(parsed_dt)
        except ValueError:
            continue
            
    found_dates = sorted(list(set(found_dates)))
    
    if found_dates:
        if found_dates[0].year < 1930:
            geb_datum = found_dates[0]
            if len(found_dates) > 1:
                deportations_datum = found_dates[1]
        else:
            deportations_datum = found_dates[0]

    # Geburtsort extrahieren
    ort_match = re.search(r"\bin\s+([a-zA-ZäöüÄÖÜß\s\-]+)", text)
    if ort_match:
        ort_candidate = ort_match.group(1).strip()
        ort_candidate = re.split(r'(Deport|geb|\d|,|;|\()', ort_candidate)[0].strip()
        if ort_candidate and ort_candidate.lower() not in ["die", "den", "der"]:
            geb_ort = ort_candidate

    # Dynamische Zielort-Erkennung
    lager_liste = [
        "Lodz", "Litzmannstadt", "Riga", "Theresienstadt", "Auschwitz", 
        "Minsk", "Kowno", "Sobibor", "Treblinka", "Majdanek", "Trawniki", "Shanghai"
    ]
    for lager in lager_liste:
        if lager.lower() in text.lower():
            if lager == "Shanghai" or (lager in text and "in " + lager in text and len(found_dates) == 1):
                continue
            deportations_ziel = lager
            break

    return nachname, vorname, geburtsname, geb_datum, geb_ort, deportations_datum, deportations_ziel


# 4. CSV EINLESEN UND IN DATENBANK SCHREIBEN
def import_friedenau_data_ultimate(csv_filepath):
    conn = psycopg2.connect(**DB_CONFIG)
    cursor = conn.cursor()
    
    current_strasse = "Unbekannte Straße"
    success_count = 0
    
    with open(csv_filepath, mode="r", encoding="utf-8", errors="ignore") as f:
        reader = csv.reader(f, delimiter=";")
        
        for row in reader:
            if not row or all(cell.strip() == "" for cell in row):
                continue
                
            first_cell = row[0].strip()
            
            # Unreine Zeilen / Metadaten überspringen
            if "Friedenauer Mitbürger" in first_cell or first_cell == "(*)":
                continue
            if len(row) > 1 and "Nicht überprüfbar" in row[1]:
                continue
                
            # VERBESSERTE ERKENNUNG: Prüft strikt den ANFANG der Zeile.
            # Eine Personen-Zeile MUSS am Anfang eine typische Nummerierung haben (z.B. "Nr. 79", "Nn 79", "13/14").
            # Das verhindert, dass Straßenüberschriften wie "Bundesplatz (...)" fälschlicherweise als Personen erkannt werden.
            ist_personen_zeile = bool(re.match(r'^(Nr\.|Nr|Nn\.|Nn)\s*', first_cell, re.IGNORECASE)) or \
                                 bool(re.match(r'^\d+', first_cell))
            
            # Fall 1: Es ist eine Personen-Zeile
            if ist_personen_zeile:
                # 1. Kürzel am Anfang wegschneiden (z.B. "Nr. ", "Nn ")
                rohe_nummer = re.sub(r'^(Nr\.|Nr|Nn\.|Nn)\s*', '', first_cell, flags=re.IGNORECASE).strip()
                
                # 2. Isoliert nur die Hausnummer selbst am Zeilenanfang (Ziffern, Schrägstriche, Buchstaben wie "79a")
                nr_match = re.match(r'^([0-9a-zA-Z/\-\s]+)', rohe_nummer)
                if nr_match:
                    hausnummer = nr_match.group(1).strip()
                else:
                    hausnummer = rohe_nummer[:20].strip() # Fallback
                
                info_text = row[1].strip() if len(row) > 1 else ""
                quell_oder_gedenk_status = row[2].strip() if len(row) > 2 else ""
                
                quell_kategorie = quell_oder_gedenk_status if "Gedenkbuch" in quell_oder_gedenk_status else None
                gedenk_status = "Stolperstein verlegt" if "Stolperstein" in quell_oder_gedenk_status else quell_oder_gedenk_status

                # Extraktion der Biografie-Details ausführen
                (nachname, vorname, geburtsname, geb_datum, geb_ort, 
                 deportations_datum, deportations_ziel) = parse_biography_ultimate(info_text)

                # Falls der Nachname trotz allem leer bleibt, überspringen wir die Zeile zum Schutz der DB
                if not nachname:
                    continue

                # Schicksals-Status ermitteln
                schicksal_status = "Verfolgt"
                if "überlebt" in info_text.lower():
                    schicksal_status = "Überlebt"
                elif "shanghai" in info_text.lower() or "emigriert" in info_text.lower() or "flucht" in info_text.lower():
                    schicksal_status = "Flucht / Emigration"
                elif deportations_ziel:
                    schicksal_status = f"Deportiert nach {deportations_ziel}"

                insert_query = """
                    INSERT INTO friedenau_stolpersteine_kompakt (
                        strassenname, hausnummer, nachname, vorname, geburtsname, 
                        geburtsdatum, geburtsort, deportationsdatum, deportationsziel,
                        schicksal_status, quell_kategorie, gedenk_status, anmerkungen
                    ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s);
                """
                
                cursor.execute(insert_query, (
                    current_strasse, hausnummer, nachname, vorname, geburtsname,
                    geb_datum, geb_ort, deportations_datum, deportations_ziel,
                    schicksal_status, quell_kategorie, gedenk_status, info_text
                ))
                success_count += 1
                
            # Fall 2: Es ist eine echte Straßenzeile / Platzwechsel (Überschrift komplett übernehmen)
            else:
                if first_cell:
                    current_strasse = first_cell

    conn.commit()
    cursor.close()
    conn.close()
    print(f"Import beendet. {success_count} Einträge wurden erfolgreich in die Datenbank geschrieben.")

if __name__ == "__main__":
    script_dir = os.path.dirname(os.path.abspath(__file__))
    csv_pfad = os.path.join(script_dir, "Liste Adr. Namen-Tabelle 1.csv")
    
    import_friedenau_data_ultimate(csv_pfad)