#!/usr/bin/env python3

import subprocess
import re
import time
import argparse

# Argumente verarbeiten
parser = argparse.ArgumentParser(description="ZFS Snapshot Übersicht")
parser.add_argument("--filter", help="Nur bestimmte Datasets anzeigen (Regex möglich, z.B. 'rpool/ROOT')", type=str)
args = parser.parse_args()

# Snapshots abrufen
_snapshots = subprocess.check_output(["zfs", "list", "-t", "snapshot", "-Hpo", "name,creation"],encoding="utf-8")

_datasets = {}

# Snapshots parsen
for _datastore, _snapshot, _creation in re.findall(
        r"^([\w_./-]+)@([\w_.:-]+)\t(\d+)",
        _snapshots,
        re.M):

    if args.filter and not re.search(args.filter, _datastore):
        continue

    if _datastore not in _datasets:
        _datasets[_datastore] = {}

    # -------------------------------------------------
    # Snapshot-Typ automatisch erkennen
    # -------------------------------------------------
    if _snapshot.startswith("zfs-auto-snap_"):
        m = re.match(r"zfs-auto-snap_([^-\s]+)-", _snapshot)
        _label = m.group(1) if m else "zfs-auto-snap"

    elif re.match(r"^[^_]+_\d{4}-\d{2}-\d{2}", _snapshot):
        # Beispiel: bashclub-zfs_2025-09-05_06:25:24
        _label = _snapshot.split("_")[0]

    else:
        # Fallback → alles vor erstem Datum abschneiden
        _label = re.sub(r'[-_]\d{4}-\d{2}-\d{2}.*$', '', _snapshot)

    # -------------------------------------------------

    if _label not in _datasets[_datastore]:
        _datasets[_datastore][_label] = []

    _datasets[_datastore][_label].append((_snapshot, int(_creation)))

# Ergebnisse anzeigen
for _datastore in _datasets:
    print(_datastore)
    print("-" * 40)

    for _label in sorted(_datasets[_datastore]):
        _data = _datasets[_datastore][_label]
        _data.sort(key=lambda x: x[1])

        _first = time.strftime("%d.%m.%Y %H:%M:%S", time.localtime(_data[0][1]))
        _last = time.strftime("%d.%m.%Y %H:%M:%S", time.localtime(_data[-1][1]))
        _count = len(_data)

        print(f" {_label} {_count}")
        print(f"   {_first} {_data[0][0]}")
        if _count > 1:
            print(f"   {_last} {_data[-1][0]}")

    print("")
