#!/usr/bin/env python3
# SPDX-License-Identifier: GPL-3.0-or-later
#
# pocketds-steam-no-idle-suspend — turn off Steam's idle suspend for
# gaming mode.
#
# Gaming mode holds a logind block lock on sleep because suspend does not
# survive on the Pocket DS yet. Steam's own idle timer (Settings → Power,
# "Suspend after", 1 h on AC by default) still fires: Steam blanks its UI
# and asks logind to suspend, the request is refused, and Steam never
# leaves its pre-sleep state, so the top screen stays black. Setting both
# timeouts to 0 ("Disabled" in the Steam UI) keeps Steam from trying.
#
# Steam rewrites config.vdf on exit, so this runs from the gaming session
# before Steam starts, every time, and skips if Steam is already up.

import importlib.machinery
import importlib.util
import sys

_loader = importlib.machinery.SourceFileLoader(
    "pocketds_steam_vdf", "/usr/bin/pocketds-steam-default-proton11")
_spec = importlib.util.spec_from_loader(_loader.name, _loader)
vdf = importlib.util.module_from_spec(_spec)
_loader.exec_module(vdf)

SYSTEM = ["InstallConfigStore", "Software", "Valve", "Steam", "system"]
KEYS = ("IdleSuspendACSeconds", "IdleSuspendBatterySeconds")


def log(msg: str) -> None:
    print(f"pocketds-steam-no-idle-suspend: {msg}", file=sys.stderr)


def main() -> int:
    if vdf.steam_running():
        log("Steam is running and would overwrite config.vdf on exit — skipping")
        return 0
    if not vdf.CONFIG_VDF.exists():
        tree = {}
    else:
        try:
            tree = vdf.parse_vdf(vdf.CONFIG_VDF.read_text(encoding="utf-8", errors="replace"))
        except Exception as exc:
            log(f"could not parse {vdf.CONFIG_VDF}: {exc}; refusing to overwrite")
            return 1

    node = tree
    for key in SYSTEM:
        node = node.get(key) if isinstance(node, dict) else None
    if isinstance(node, dict) and all(node.get(k) == "0" for k in KEYS):
        return 0

    for k in KEYS:
        vdf.deep_set(tree, SYSTEM + [k], "0")
    vdf.atomic_write(vdf.CONFIG_VDF, vdf.serialise(tree))
    log("Steam idle suspend disabled")
    return 0


if __name__ == "__main__":
    sys.exit(main())
