import winreg
import json
import os


def get_dropbox_root() -> str:
    """
    Vrátí kořenovou cestu složky Dropbox na tomto počítači.

    Dropbox může být nainstalován na různých discích (C:, U:, Z: …),
    ale struktura složek uvnitř zůstává vždy stejná. Tato funkce zjistí
    aktuální umístění, takže ostatní skripty nemusí cestu napevno zadávat.

    Postup hledání (v tomto pořadí):
      1. Registr HKCU\\Software\\Dropbox\\ks  — hlavní klíč, hodnota "Personal"
         je uložena jako byte array v kódování UTF-16 LE.
      2. Registr HKCU\\Software\\Dropbox\\ks1 — alternativní klíč používaný
         novějšími verzemi klienta Dropbox.
      3. Soubor info.json v %APPDATA%\\Dropbox\\ nebo %LOCALAPPDATA%\\Dropbox\\
         — záložní metoda, pokud registr cestu neobsahuje.

    Vrací:
        str: Absolutní cesta ke kořenové složce Dropboxu, např. "U:\\Dropbox".

    Vyvolá:
        RuntimeError: Pokud se cestu nepodaří zjistit žádnou z metod.

    Příklad použití:
        from Knihovny.najdi_dropbox import get_dropbox_root
        import os

        ROOT     = get_dropbox_root()
        PACIENTI = os.path.join(ROOT, "Ordinace", "Pacienti")
    """

    # Metoda 1 a 2: registr HKCU\Software\Dropbox\ks a ks1
    for subkey in (r"Software\Dropbox\ks", r"Software\Dropbox\ks1"):
        try:
            with winreg.OpenKey(winreg.HKEY_CURRENT_USER, subkey) as key:
                value, _ = winreg.QueryValueEx(key, "Personal")
                path = bytes(value).decode("utf-16-le").rstrip("\x00")
                if path:
                    return path
        except (OSError, UnicodeDecodeError):
            continue

    # Metoda 3: záložní — info.json v AppData
    for base in (os.getenv("APPDATA", ""), os.getenv("LOCALAPPDATA", "")):
        info_path = os.path.join(base, "Dropbox", "info.json")
        if os.path.isfile(info_path):
            with open(info_path, encoding="utf-8") as f:
                info = json.load(f)
            path = (info.get("personal") or info.get("business") or {}).get("path", "")
            if path:
                return path

    raise RuntimeError("Nepodařilo se zjistit cestu k Dropboxu.")


if __name__ == "__main__":
    root = get_dropbox_root()
    print(f"Dropbox root: {root}")
