"""Backup-Engine — Time-Machine-artige Snapshots über Timeshift (CLI).

UI-frei: liefert nur argv-Listen + parst die Timeshift-Ausgabe. Timeshift
braucht für ALLES root (auch `--list`) → das Frontend schleust die argv durch
den privilegierten Helper (pkexec).
"""
from __future__ import annotations

import re
import shutil
from dataclasses import dataclass

# Zeitstempel-Name eines Snapshots, z.B. "2024-01-02_00-00-01".
_NAME_RE = re.compile(r"\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}")


@dataclass
class Snapshot:
    name: str           # Zeitstempel, z.B. "2024-01-02_00-00-01"
    tags: str           # Buchstaben-Tags (O/B/H/D/W/M)
    description: str     # freier Kommentar


def available() -> bool:
    return shutil.which("timeshift") is not None


def list_argv() -> list[str]:
    return ["timeshift", "--list"]


def create_argv(comment: str) -> list[str]:
    return ["timeshift", "--create", "--comments", comment or "TANINUX", "--scripted"]


def delete_argv(name: str) -> list[str]:
    return ["timeshift", "--delete", "--snapshot", name, "--yes"]


def restore_argv(name: str) -> list[str]:
    # Sehr destruktiv: stellt das System wieder her, ggf. Reboot nötig.
    return ["timeshift", "--restore", "--snapshot", name, "--yes"]


def parse_list(text: str) -> list[Snapshot]:
    """Parst die Ausgabe von `timeshift --list`.

    BTRFS-Format: nach einer Trennlinie ("----") Zeilen wie
        `0    >  2024-01-02_00-00-01  O     mein kommentar`
    Robust per Regex auf den Zeitstempel; der Rest danach ist tags+description.
    Header- und Trennzeilen werden ignoriert.
    """
    snapshots: list[Snapshot] = []
    for line in text.splitlines():
        match = _NAME_RE.search(line)
        if match is None:
            continue
        name = match.group(0)
        rest = line[match.end():].split(maxsplit=1)
        tags = rest[0] if rest else ""
        description = rest[1].strip() if len(rest) > 1 else ""
        snapshots.append(Snapshot(name=name, tags=tags, description=description))
    return snapshots
