#!/bin/bash
# Medizinisches Archiv - Inbox Processing Script

DB="$HOME/Gesundheit/health_data.db"
INBOX="$HOME/Gesundheit/Inbox"
ARCHIV_LABOR="$HOME/Gesundheit/Archiv/Laborwerte"
ARCHIV_BEFUND="$HOME/Gesundheit/Archiv/Klinische_Befunde"
ARCHIV_WEARABLE="$HOME/Gesundheit/Archiv/Wearables"

PROCESSED=0
SKIPPED=0
ERRORS=0

is_duplicate() {
    local fname="$1"
    local count=$(sqlite3 "$DB" "SELECT COUNT(*) FROM dokumente WHERE datei_name='$fname';")
    [ "$count" -gt 0 ]
}

get_category() {
    local fname="$1"
    local content="$2"
    if echo "$content" | grep -qi "laborbefund\|labor\|blutbild\|klinische chemie\|blutuntersuchung\|rheumatologie\|haematologie\|haematology"; then
        echo "LABOR"
    elif echo "$content" | grep -qi "röntgen\|radiologie\|mri\|mrt\|befund\|sonographie\|ultraschall\|duplex\|ct\b"; then
        echo "BEFUNDE"
    elif echo "$content" | grep -qi "notfall\|notfallstation\|notfallpraxis"; then
        echo "BEFUNDE"
    elif echo "$content" | grep -qi "allergie\|dermat\|haut"; then
        echo "BEFUNDE"
    elif echo "$content" | grep -qi "augen\|ophthalm"; then
        echo "BEFUNDE"
    elif echo "$content" | grep -qi "wearable\|fitbit\|apple\|garmin\|schlaf\|schritt"; then
        echo "WEARABLES"
    else
        echo "BEFUNDE"
    fi
}

extract_date() {
    local fname="$1"
    local datestr=$(echo "$fname" | grep -oP '^\d{6}' | head -1)
    if [ -n "$datestr" ] && [ ${#datestr} -eq 6 ]; then
        local year="${datestr:0:2}"
        local month="${datestr:2:2}"
        local day="${datestr:4:2}"
        if [ "$year" -lt 50 ]; then
            year="20$year"
        else
            year="19$year"
        fi
        echo "${year}-${month}-${day}"
        return
    fi
    local found_date=$(echo "$fname" | grep -oP '\d{2}[./]\d{2}[./]\d{4}' | head -1)
    if [ -n "$found_date" ]; then
        echo "$found_date" | sed 's|/|.|g'
        return
    fi
    echo "unknown"
}

sql_escape() {
    echo "$1" | sed "s/'/''/g" | tr -cd '[:print:]'
}

parse_labor_values() {
    local content="$1"
    local date="$2"
    local category="$3"
    local fname="$4"

    local params=(
        "Leukozyten" "Erythrozyten" "Haemoglobin" "Haemoglobin" "Haematokrit" "Thrombozyten"
        "MCV" "RDW" "Neutrophile" "Eosinophile" "Basophile" "Monozyten" "Lymphozyten"
        "Homocystein" "Kreatinin" "eGFR" "Harnsaure" "Harnsäure" "Cholesterin"
        "Triglyceride" "LDL" "HDL" "Glukose" "Glucose" "HbA1c"
        "Ferritin" "Eisen" "Transferrin" "Vitamin B12" "Holotranscobalamin"
        "Folsaure" "Folsäure" "Testosteron" "TSH" "freies T4" "freies T3"
        "Vitamin D" "25-OH-Vitamin D" "CRP" "C-reaktives Protein"
        "Procalcitonin" "Immunglobulin" "Transglutaminase"
    )

    for param in "${params[@]}"; do
        if echo "$content" | grep -qi "$param"; then
            local value=$(echo "$content" | grep -A2 -i "$param" | grep -oP '\d+\.?\d*' | head -1)
            local unit=$(echo "$content" | grep -A3 -i "$param" | grep -oP '[µμ]?[a-zA-Z/]+(mol|l|min|ml|pmol|nmol|U|ng|mg|%|mmol)?' | head -1)

            if [ -n "$value" ]; then
                local safe_param=$(sql_escape "$param")
                local safe_value=$(sql_escape "$value")
                local safe_unit=$(sql_escape "$unit")
                local safe_date=$(sql_escape "$date")
                local safe_fname=$(sql_escape "$fname")

                sqlite3 "$DB" "INSERT INTO health_events (date, category, parameter, value, unit, source, notes) VALUES ('$safe_date', '$category', '$safe_param', '$safe_value', '$safe_unit', '$safe_fname', 'Laborbefund');"
                echo "  -> $param: $value $safe_unit"
            fi
        fi
    done
}

parse_befund_notes() {
    local content="$1"
    local date="$2"
    local category="$3"
    local fname="$4"

    local lines=$(echo "$content" | grep -i "diagnose\|befund\|befunde\|diagnose:" | head -5)

    if [ -n "$lines" ]; then
        while IFS= read -r line; do
            local safe_line=$(sql_escape "$line" | tr '\n' ' ' | head -c 200)
            if [ -n "$safe_line" ]; then
                local safe_date=$(sql_escape "$date")
                local safe_fname=$(sql_escape "$fname")
                sqlite3 "$DB" "INSERT INTO health_events (date, category, parameter, value, source, notes) VALUES ('$safe_date', '$category', 'Befundnotiz', '$safe_line', '$safe_fname', '');"
            fi
        done <<< "$lines"
    fi
}

process_file() {
    local filepath="$1"
    local fname=$(basename "$filepath")

    if is_duplicate "$fname"; then
        echo "⏭  Übersprungen (bereits verarbeitet): $fname"
        SKIPPED=$((SKIPPED + 1))
        return
    fi

    echo ""
    echo "📄 Verarbeite: $fname"

    local content=$(pdftotext "$filepath" - 2>/dev/null)
    if [ -z "$content" ]; then
        echo "  ⚠️  Kein Text extrahierbar (gescanntes PDF?)"
        local size_kb=$(( $(stat -c%s "$filepath") / 1024 ))
        sqlite3 "$DB" "INSERT OR REPLACE INTO dokumente (datei_name, dateipfad, daten_typ, groessekbytes, status) VALUES ('$fname', '$filepath', 'pdf', $size_kb, 'neu');"
        ERRORS=$((ERRORS + 1))
        return
    fi

    local category=$(get_category "$fname" "$content")
    local date=$(extract_date "$fname")
    local size_kb=$(( $(stat -c%s "$filepath") / 1024 ))

    sqlite3 "$DB" "INSERT OR REPLACE INTO dokumente (datei_name, dateipfad, daten_typ, groessekbytes, status) VALUES ('$fname', '$filepath', 'pdf', $size_kb, 'ver');"

    echo "  📊 Kategorie: $category | Datum: $date"

    if [ "$category" = "LABOR" ]; then
        echo "  🔬 Laborwerte extrahiert:"
        parse_labor_values "$content" "$date" "$category" "$fname"
    else
        echo "  📋 Befundnotizen extrahiert:"
        parse_befund_notes "$content" "$date" "$category" "$fname"
    fi

    local dest=""
    case "$category" in
        "LABOR") dest="$ARCHIV_LABOR" ;;
        "BEFUNDE") dest="$ARCHIV_BEFUND" ;;
        "WEARABLES") dest="$ARCHIV_WEARABLE" ;;
        *) dest="$ARCHIV_BEFUND" ;;
    esac

    mv "$filepath" "$dest/"
    PROCESSED=$((PROCESSED + 1))
    echo "  ✅ Archiviert: $(basename $dest)/"
}

echo "=========================================="
echo " Medizinisches Archiv - Inbox Processing"
echo " $(date)"
echo "=========================================="

for f in "$INBOX"/*.pdf "$INBOX"/*.PDF "$INBOX"/*.Pdf; do
    [ -f "$f" ] && process_file "$f"
done

echo ""
echo "=========================================="
echo " Zusammenfassung:"
echo " ✅ Verarbeitet: $PROCESSED"
echo " ⏭  Übersprungen: $SKIPPED"
echo " ⚠️  Fehler: $ERRORS"
echo "=========================================="
