#!/usr/bin/python3
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyright (C) 2026 Ondrej Holba
"""Holbox NAS – tovární nastavení z konzole NASu (zapomenuté heslo správce i záchranné kódy 2FA). Jen root.
Síť a název NASu zůstanou, data v poolech zůstanou (pooly se odpojí a průvodce je nabídne k importu).
Použití: holbox-nas-factory-reset            – nastavení na výchozí, data zůstanou
         holbox-nas-factory-reset --wipe     – navíc smaže všechna data na discích poolů"""
import json
import os
import secrets
import shutil
import socket
import sys
import time
import urllib.request

TOKEN = "/run/archa-nas-factory.token"
URL = "http://127.0.0.1:8080"

if os.geteuid() != 0:
    sys.exit("Spusť jako root (sudo holbox-nas-factory-reset).")
wipe = "--wipe" in sys.argv[1:]
host = socket.gethostname()
print("Holbox NAS – TOVÁRNÍ NASTAVENÍ\n")
print("Smaže se: účet správce a 2FA, uživatelé a skupiny, sdílené složky, plány snapshotů, zálohovací úlohy,")
print("Telegram a e-mail, UPS, plán zapnutí a vypnutí, iSCSI, Home Assistant (jeho disk v poolu zůstane),")
print("historie akcí a upozornění. Zůstane: síť, název NASu, systém a jeho verze.")
print("POZOR: smažou se i VŠECHNA DATA na discích poolů!\n" if wipe else "Data v poolech zůstanou – pooly se odpojí a průvodce je nabídne k připojení.\n")
if input("Pro potvrzení napiš OBNOVIT: ").strip().upper() != "OBNOVIT":
    sys.exit("Zrušeno.")
if wipe and input(f"Pro smazání dat napiš název NASu ({host}): ").strip() != host:
    sys.exit("Zrušeno.")

tok = secrets.token_urlsafe(32)
with open(TOKEN + ".tmp", "w") as f:
    f.write(tok)
os.chmod(TOKEN + ".tmp", 0o640)
shutil.chown(TOKEN + ".tmp", "root", "archa")
os.replace(TOKEN + ".tmp", TOKEN)
try:
    req = urllib.request.Request(URL + "/api/factory-reset/console", data=json.dumps({"wipe": wipe}).encode(), method="POST",
                                 headers={"Content-Type": "application/json", "X-MiniNAS": "1", "X-Archa-Factory": tok})
    try:
        urllib.request.urlopen(req, timeout=30).read()
    except urllib.error.HTTPError as e:
        sys.exit("Obnova se nespustila: " + (json.loads(e.read() or b"{}").get("error") or str(e)))
    print("Obnova běží…")
    last = -1
    for _ in range(600):
        time.sleep(1)
        try:
            st = json.loads(urllib.request.urlopen(URL + "/api/setup/factory", timeout=10).read())
        except Exception:  # noqa – služba se může na chvíli zastavit
            continue
        if st.get("step") != last and st.get("steps"):
            last = st["step"]
            print(f"  {min(last + 1, len(st['steps']))}/{len(st['steps'])} {st['steps'][min(last, len(st['steps']) - 1)]}")
        if not st.get("running"):
            for e in st.get("errors") or []:
                print("  ! " + e)
            print("\nHotovo. Otevři správu NASu v prohlížeči – spustí se průvodce prvním spuštěním.")
            break
    else:
        print("Obnova pořád běží – stav uvidíš ve správě NASu.")
finally:
    try:
        os.remove(TOKEN)
    except OSError:
        pass
