"""
  Set proxy for nix-daemon to speed up downloads
  You can safely ignore this file if you don't need a proxy.
                                                                                                                                                                                                                                                                                          
  https://github.com/NixOS/nix/issues/1472#issuecomment-1532955973
"""

import os
import plistlib
import shlex
import subprocess
from pathlib import Path


NIX_DAEMON_PLIST = Path("/Library/LaunchDaemons/org.nixos.nix-daemon.plist")
NIX_DAEMON_NAME = "org.nixos.nix-daemon"
# http proxy provided by my homelab's bypass router
HTTP_PROXY = "http://192.168.5.101:7890"

PLIST = plistlib.loads(NIX_DAEMON_PLIST.read_bytes())


def update_plist():
    os.chmod(NIX_DAEMON_PLIST, 0o644)
    NIX_DAEMON_PLIST.write_bytes(plistlib.dumps(PLIST))
    os.chmod(NIX_DAEMON_PLIST, 0o444)


def reload_daemon():
    # reload the plist
    for cmd in (
        f"launchctl unload {NIX_DAEMON_PLIST}",
        f"launchctl load {NIX_DAEMON_PLIST}",
    ):
        print(cmd)
        subprocess.run(shlex.split(cmd), capture_output=False)


def set_proxy():
    # set http/https proxy
    # NOTE: curl only accept the lowercase of `http_proxy`!
    # NOTE: https://curl.se/libcurl/c/libcurl-env.html
    PLIST["EnvironmentVariables"]["http_proxy"] = HTTP_PROXY
    PLIST["EnvironmentVariables"]["https_proxy"] = HTTP_PROXY
    update_plist()
    reload_daemon()


def unset_proxy():
    # remove http proxy
    PLIST["EnvironmentVariables"].pop("http_proxy", None)
    PLIST["EnvironmentVariables"].pop("https_proxy", None)
    update_plist()
    reload_daemon()


if __name__ == "__main__":
    # set_proxy()
    unset_proxy()
