#!/usr/bin/env python3
"""
Listet überfällige und heute fällige Anrufe aus der Callkeep-SQLite-DB auf.

Usage:
    python callkeep-overdue.py [TAGE_TOLERANZ]

Beispiel:
    python callkeep-overdue.py 0      # nur strikt überfällige
    python callkeep-overdue.py 2      # überfällig oder in 2 Tagen fällig
"""
import sqlite3
import sys
import datetime

DB_PATH = "/DATA/.media/HDD_1TB/CallKeep/callkeep.db"

FREQ_DAYS = {
    "Täglich": 1,
    "Wöchentlich": 7,
    "Alle 2 Wochen": 14,
    "Monatlich": 30,
    "Alle 2 Monate": 60,
    "Vierteljährlich": 90,
    "Halbjährlich": 180,
    "Jährlich": 365,
}


def parse_date(s):
    if not s:
        return None
    try:
        return datetime.datetime.fromisoformat(s.replace("T", " ").split(".")[0]).date()
    except ValueError:
        try:
            return datetime.datetime.strptime(s.split("T")[0], "%Y-%m-%d").date()
        except ValueError:
            return None


def main(tolerance_days=0):
    today = datetime.date.today()
    conn = sqlite3.connect(DB_PATH)
    conn.row_factory = sqlite3.Row
    c = conn.cursor()
    c.execute(
        """
        SELECT c.id, c.name, c.frequency, MAX(cl.called_at) AS last_call
        FROM contacts c
        LEFT JOIN calls cl ON c.id = cl.contact_id
        GROUP BY c.id
        ORDER BY c.name
        """
    )
    rows = c.fetchall()
    conn.close()

    urgent = []
    for r in rows:
        name = r["name"]
        freq = r["frequency"]
        last = parse_date(r["last_call"])
        interval = FREQ_DAYS.get(freq, 30)

        if last is None:
            urgent.append((name, freq, None, None, "noch nie angerufen"))
            continue

        days_since = (today - last).days
        due_in = interval - days_since
        if due_in < 0:
            urgent.append((name, freq, days_since, due_in, "überfällig"))
        elif due_in <= tolerance_days:
            urgent.append((name, freq, days_since, due_in, "fällig"))

    if not urgent:
        print("Keine überfälligen oder fälligen Anrufe.")
        return

    for name, freq, days_since, due_in, status in urgent:
        if days_since is None:
            print(f"• {name} ({freq}) — noch nie angerufen")
        elif due_in < 0:
            print(f"• {name} ({freq}) — letzter Anruf vor {days_since} Tagen, überfällig um {-due_in} Tage")
        else:
            print(f"• {name} ({freq}) — fällig in {due_in} Tagen")


if __name__ == "__main__":
    tolerance = int(sys.argv[1]) if len(sys.argv) > 1 else 0
    main(tolerance)
