"""
Audit-Log-Helper für den NotebookLM Kurator.
Hängt append-only Zeilen an die Audit-Log-Datei.

Pfad ist Pflicht-Parameter — kein impliziter Vault-Default.
Der Aufrufer übergibt typischerweise `cfg.paths.kurator_state_root / "audit-log.md"`.

Format-Version v1 eingefroren ab Bundle 0.11.0. Änderungen am Format
erfordern einen Major-Bump auf v2 mit dokumentierter Migration.
"""

from datetime import datetime
from pathlib import Path


def _prefix(value: str | None, length: int) -> str:
    """Gibt die ersten `length` Zeichen zurück, oder '-' wenn None."""
    if value is None:
        return "-"
    return value[:length]


def append(
    action: str,
    notebook_id: str | None,
    source_id: str | None,
    url_hash: str | None,
    status: str,
    message: str,
    audit_log_path: Path,
) -> None:
    """Hängt eine Audit-Log-Zeile an.

    audit_log_path ist Pflicht-Parameter. Kein Vault-Default mehr —
    der LLM-Agent übergibt den Pfad aus `cfg.paths.kurator_state_root /
    "audit-log.md"` oder einer äquivalenten Quelle.

    Format (v1, eingefroren ab Bundle 0.11.0):
    <timestamp> | <action> | notebook=<nb-prefix> | source=<src-prefix> | url-hash=<hash-prefix> | status=<status> | <message>

    Prefixe: erste 8 Zeichen der ID, erste 12 Zeichen des Hashes, '-' für None.

    Append-only: Datei wird im Modus 'a' geöffnet.
    Parent-Verzeichnis wird bei Bedarf angelegt.
    IOError wird nicht gecatcht — Exception nach oben reichen.
    """
    audit_log_path = Path(audit_log_path)
    audit_log_path.parent.mkdir(parents=True, exist_ok=True)

    # Zeitstempel mit lokaler Zeitzone (Europe/Berlin oder aktuelle Systemzeit)
    try:
        from zoneinfo import ZoneInfo
        now = datetime.now(ZoneInfo("Europe/Berlin"))
    except Exception:
        # Fallback: lokale Systemzeit mit UTC-Offset
        now = datetime.now().astimezone()

    # ISO 8601 mit Timezone-Offset (±HH:MM)
    offset = now.strftime("%z")  # z.B. "+0200"
    offset_formatted = f"{offset[:3]}:{offset[3:]}" if offset else "+00:00"
    timestamp = now.strftime("%Y-%m-%dT%H:%M:%S") + offset_formatted

    nb_prefix = _prefix(notebook_id, 8)
    src_prefix = _prefix(source_id, 8)
    hash_prefix = _prefix(url_hash, 12)

    line = (
        f"{timestamp} | {action} | notebook={nb_prefix} | "
        f"source={src_prefix} | url-hash={hash_prefix} | "
        f"status={status} | {message}\n"
    )

    # append-only, UTF-8 für korrekte Umlaut-Speicherung
    with open(audit_log_path, "a", encoding="utf-8") as f:
        f.write(line)
