#!/usr/bin/python3

import fcntl
import os
from pathlib import Path
import sys
import time

import gi

gi.require_version("Gio", "2.0")
from gi.repository import Gio


FAVORITES_SCHEMA = "org.gnome.shell"
FAVORITES_KEY = "favorite-apps"
MAX_WAIT_SECONDS = 30 * 60
POLL_SECONDS = 2


def application_directories():
    data_home = Path(os.environ.get("XDG_DATA_HOME", Path.home() / ".local/share"))
    return (
        data_home / "applications",
        Path("/usr/local/share/applications"),
        Path("/usr/share/applications"),
        data_home / "flatpak/exports/share/applications",
        Path("/var/lib/flatpak/exports/share/applications"),
    )


def desktop_is_installed(desktop_file):
    return any((directory / desktop_file).exists() for directory in application_directories())


def pin_browser(desktop_file):
    settings = Gio.Settings.new(FAVORITES_SCHEMA)
    favorites = list(settings.get_strv(FAVORITES_KEY))
    favorites = [item for item in favorites if item != desktop_file]
    favorites.insert(0, desktop_file)

    return settings.set_strv(FAVORITES_KEY, favorites)


def main(argv):
    if len(argv) != 2:
        return 2

    desktop_file = argv[1]
    if Path(desktop_file).name != desktop_file or not desktop_file.endswith(".desktop"):
        return 2

    runtime_dir = Path(os.environ.get("XDG_RUNTIME_DIR", f"/tmp/quick-setup-{os.getuid()}"))
    runtime_dir.mkdir(mode=0o700, parents=True, exist_ok=True)
    lock_name = desktop_file.replace("/", "_") + ".pin.lock"

    with (runtime_dir / lock_name).open("w") as lock:
        try:
            fcntl.flock(lock, fcntl.LOCK_EX | fcntl.LOCK_NB)
        except BlockingIOError:
            return 0

        deadline = time.monotonic() + MAX_WAIT_SECONDS
        while time.monotonic() < deadline:
            if desktop_is_installed(desktop_file):
                return 0 if pin_browser(desktop_file) else 1
            time.sleep(POLL_SECONDS)

    return 1


if __name__ == "__main__":
    raise SystemExit(main(sys.argv))
