#!/usr/bin/env python3
"""Posteingang sortieren mit festen Regeln, ganz ohne KI.
Liest neue (ungelesene) Mails per IMAP und verschiebt sie nach Regeln in Ordner. Still, wenn nichts neu ist.
Vorlage von madebybrain.com/hermes-jobs (MIT). Läuft als Hermes-Job ohne KI (--no-agent), z. B. alle 30 Minuten.
Zugangsdaten nur als Umgebungsvariablen (z. B. in ~/.hermes/.env): IMAP_HOST, IMAP_USER, IMAP_PASS.
Testen ohne Verschieben: postfach_sortieren.py --probe
"""
import email
import email.header
import imaplib
import os
import re
import sys

# Regeln: Ordnername -> Muster für "Absender Betreff". Reihenfolge zählt, die erste passende Regel gewinnt.
REGELN = [
    ("Spam",        r"(?i)\b(casino|crypto ?bonus|viagra|gewinnspiel)\b"),
    ("Rechnungen",  r"(?i)\b(rechnung|invoice|receipt|beleg|zahlungseingang)\b"),
    ("Newsletter",  r"(?i)\b(newsletter|weekly digest|unsubscribe|abmelden)\b|noreply@|no-reply@"),
    ("Projekte",    r"(?i)\b(angebot|projekt|auftrag|termin)\b"),
]
PROBE = "--probe" in sys.argv


def dekodiere(wert):
    return "".join(t.decode(c or "utf-8", "ignore") if isinstance(t, bytes) else t
                   for t, c in email.header.decode_header(wert or ""))


imap = imaplib.IMAP4_SSL(os.environ["IMAP_HOST"])
imap.login(os.environ["IMAP_USER"], os.environ["IMAP_PASS"])
imap.select("INBOX")
_, ids = imap.search(None, "UNSEEN")
zaehler = {}
for mid in ids[0].split():
    _, daten = imap.fetch(mid, "(BODY.PEEK[HEADER.FIELDS (FROM SUBJECT)])")
    kopf = email.message_from_bytes(daten[0][1])
    text = dekodiere(kopf["From"]) + " " + dekodiere(kopf["Subject"])
    ziel = next((ordner for ordner, muster in REGELN if re.search(muster, text)), None)
    zaehler[ziel or "bleibt im Posteingang"] = zaehler.get(ziel or "bleibt im Posteingang", 0) + 1
    if ziel and not PROBE:
        imap.create(ziel)  # existiert der Ordner schon, passiert nichts
        if imap.copy(mid, ziel)[0] == "OK":
            imap.store(mid, "+FLAGS", "\\Deleted")
if not PROBE:
    imap.expunge()
imap.logout()
if zaehler:
    print(f"Posteingang: {sum(zaehler.values())} neue Mails" + (" (Probelauf)" if PROBE else ""))
    for k, v in sorted(zaehler.items(), key=lambda x: -x[1]):
        print(f"  {k}: {v}")
