"""Lazily-built shared services handed to every module via ModuleContext.

Astal's GObject service libraries (AstalNetwork, AstalBluetooth) are consumed here
through GObject-introspection; modules connect to their `notify::` signals instead
of polling. The location service is our own singleton.
"""

from __future__ import annotations

import gi

gi.require_version("AstalNetwork", "0.1")
gi.require_version("AstalBluetooth", "0.1")
from gi.repository import AstalBluetooth, AstalNetwork  # noqa: E402

from services.location import get_location_service


class Services:
    def __init__(self) -> None:
        self._network = None
        self._bluetooth = None
        self.location = get_location_service()

    @property
    def network(self):
        if self._network is None:
            self._network = AstalNetwork.Network.get_default()
        return self._network

    @property
    def bluetooth(self):
        if self._bluetooth is None:
            self._bluetooth = AstalBluetooth.Bluetooth.get_default()
        return self._bluetooth
