"""Nextcloud — bindet den vorhandenen Desktop-Client ein. UI-frei.

Liest die Konten aus `~/.config/Nextcloud/nextcloud.cfg` (INI, Keys im Abschnitt
`[Accounts]` mit Index-Präfix wie `0\\url`, `0\\dav_user`, `0\\displayName`),
startet den Client, verwaltet den Autostart und liefert die WebDAV-URI, um ein
Konto als Nautilus-Bookmark zu hinterlegen. Alles User-Level, kein root.
"""
from __future__ import annotations

import configparser
import os
import shutil
import subprocess
from dataclasses import dataclass


def _config_home() -> str:
    return os.environ.get("XDG_CONFIG_HOME") or os.path.expanduser("~/.config")


def _cfg_path() -> str:
    return os.path.join(_config_home(), "Nextcloud", "nextcloud.cfg")


def _autostart_path() -> str:
    return os.path.join(_config_home(), "autostart", "Nextcloud.desktop")


def client_installed() -> bool:
    return shutil.which("nextcloud") is not None


@dataclass
class Account:
    name: str
    url: str
    dav_user: str


def accounts() -> list[Account]:
    """Konten aus nextcloud.cfg. Robust: leere Liste bei Fehler/fehlender Datei."""
    cp = configparser.ConfigParser()
    cp.optionxform = str  # Groß-/Kleinschreibung der Keys erhalten
    try:
        cp.read(_cfg_path(), encoding="utf-8")
    except (OSError, configparser.Error):
        return []

    if not cp.has_section("Accounts"):
        return []

    # Keys nach führendem Index gruppieren: "0\url" → idx "0", key "url".
    grouped: dict[str, dict[str, str]] = {}
    for key, value in cp.items("Accounts"):
        if "\\" not in key:
            continue
        idx, sub = key.split("\\", 1)
        grouped.setdefault(idx, {})[sub] = value

    out: list[Account] = []
    for idx in sorted(grouped):
        data = grouped[idx]
        url = data.get("url", "").strip()
        dav_user = data.get("dav_user", "").strip()
        name = data.get("displayName", "").strip() or dav_user or url
        if not url and not dav_user:
            continue
        out.append(Account(name=name, url=url, dav_user=dav_user))
    return out


def webdav_uri_from(server_url: str, user: str) -> str:
    """GVfs-WebDAV-URI (davs:// = HTTPS) aus Server-URL + User bauen — ganz
    ohne Client. Nimmt rohe Eingaben (mit/ohne https://, mit/ohne Slash)."""
    host = server_url.strip()
    for prefix in ("https://", "http://"):
        if host.startswith(prefix):
            host = host[len(prefix):]
            break
    host = host.rstrip("/")
    return f"davs://{host}/remote.php/dav/files/{user.strip()}/"


def webdav_uri(acc: Account) -> str:
    """WebDAV-URI für ein erkanntes Client-Konto (Komfort)."""
    return webdav_uri_from(acc.url, acc.dav_user)


def autostart_enabled() -> bool:
    path = _autostart_path()
    if not os.path.exists(path):
        return False
    try:
        with open(path, encoding="utf-8") as fh:
            for line in fh:
                if line.strip().lower() == "hidden=true":
                    return False
    except OSError:
        return False
    return True


_DESKTOP_ENTRY = (
    "[Desktop Entry]\n"
    "Type=Application\n"
    "Name=Nextcloud\n"
    "Exec=nextcloud --background\n"
    "Icon=Nextcloud\n"
    "Terminal=false\n"
    "X-GNOME-Autostart-enabled=true\n"
)


def set_autostart(on: bool) -> None:
    """Autostart über eine .desktop-Datei in ~/.config/autostart steuern."""
    path = _autostart_path()
    if on:
        os.makedirs(os.path.dirname(path), exist_ok=True)
        with open(path, "w", encoding="utf-8") as fh:
            fh.write(_DESKTOP_ENTRY)
    else:
        try:
            os.remove(path)
        except FileNotFoundError:
            pass
        except OSError:
            pass


def launch() -> None:
    """Client starten, ohne zu blockieren. Fehler werden geschluckt."""
    try:
        subprocess.Popen(["nextcloud"], start_new_session=True)
    except (OSError, subprocess.SubprocessError):
        pass
