#!/usr/bin/python3

# Read http://snapper.io/2025/05/16/rollback-any.html and understand
# the setup before using this program.


import subprocess
import re
import datetime
import argparse


subvolume = "/home"


def parse_options():

    parser = argparse.ArgumentParser(description = "rollabck home")
    parser.add_argument("number", type = int, help = "rollback to number")

    args = parser.parse_args()

    return args.number


def find_next_number():

    next_number = 1

    cmd = subprocess.run([ "btrfs", "subvolume", "list", subvolume ], stdout = subprocess.PIPE)

    tmp = cmd.stdout.rstrip().decode("utf-8")

    pattern = f"^@\\{subvolume}\\/\\.snapshots\\/(\\d+)\\/snapshot$"

    for tmp1 in tmp.split('\n'):
        tmp2 = tmp1.split(' ')
        tmp3 = tmp2[8]

        match = re.search(pattern, tmp3)

        if match:
            tmp4 = int(match.group(1)) + 1
            if tmp4 > next_number:
                next_number = tmp4

    print("next number is", next_number)

    return next_number


def write_info(number):

    template = """<?xml version="1.0"?>
<snapshot>
  <type>single</type>
  <num>{number}</num>
  <date>{date}</date>
  <description>rollback backup</description>
</snapshot>
"""

    data = {
        "number": number,
        "date": datetime.datetime.now(datetime.timezone.utc).strftime("%Y-%m-%d %H:%M:%S")
    }

    filename = subvolume + "/.snapshots/" + str(number) + "/info.xml"

    with open(filename, "w") as f:
        f.write(template.format(**data))


def step_rename():

    next_number = find_next_number()

    subprocess.run([ "mkdir", subvolume + "/.snapshots/" + str(next_number) ])

    subprocess.run([ "mv", subvolume + "/.snapshots/0/snapshot",
                     subvolume + "/.snapshots/" + str(next_number) + "/snapshot" ])

    subprocess.run([ "btrfs", "property", "set",
                     subvolume + "/.snapshots/" + str(next_number) + "/snapshot", "ro", "true" ])

    write_info(next_number)


def step_new_zero(number):

    subprocess.run([ "btrfs", "subvolume", "snapshot",
                     subvolume + "/.snapshots/" + str(number) + "/snapshot",
                     subvolume + "/.snapshots/0/snapshot" ])


try:
    number = parse_options()
except SystemExit:
    pass

print("rollback to", number)

step_rename()
step_new_zero(number)
