"""bluetooth usage utility to handle multiple instances."""

from __future__ import annotations

from typing import TYPE_CHECKING

import bleak
import bleak_retry_connector

from .wrappers import HaBleakClientWrapper, HaBleakScannerWrapper

if TYPE_CHECKING:
    from bleak.backends.service import BleakGATTServiceCollection

ORIGINAL_BLEAK_SCANNER = bleak.BleakScanner
ORIGINAL_BLEAK_CLIENT = bleak.BleakClient
ORIGINAL_BLEAK_RETRY_CONNECTOR_CLIENT_WITH_SERVICE_CACHE = (
    bleak_retry_connector.BleakClientWithServiceCache
)
ORIGINAL_BLEAK_RETRY_CONNECTOR_CLIENT = bleak_retry_connector.BleakClient


def install_multiple_bleak_catcher() -> None:
    """
    Wrap the bleak classes to return the shared instance.

    In case multiple instances are detected.
    """
    bleak.BleakScanner = HaBleakScannerWrapper
    bleak.BleakClient = HaBleakClientWrapper
    bleak_retry_connector.BleakClientWithServiceCache = HaBleakClientWithServiceCache
    bleak_retry_connector.BleakClient = HaBleakClientWrapper


def uninstall_multiple_bleak_catcher() -> None:
    """Unwrap the bleak classes."""
    bleak.BleakScanner = ORIGINAL_BLEAK_SCANNER
    bleak.BleakClient = ORIGINAL_BLEAK_CLIENT
    bleak_retry_connector.BleakClientWithServiceCache = (
        ORIGINAL_BLEAK_RETRY_CONNECTOR_CLIENT_WITH_SERVICE_CACHE
    )
    bleak_retry_connector.BleakClient = ORIGINAL_BLEAK_RETRY_CONNECTOR_CLIENT


class HaBleakClientWithServiceCache(HaBleakClientWrapper):
    """A BleakClient that implements service caching."""

    def set_cached_services(self, services: BleakGATTServiceCollection | None) -> None:
        """
        Set the cached services.

        No longer used since bleak 0.17+ has service caching built-in.

        This was only kept for backwards compatibility.
        """
