"""Switcher integration helpers functions."""
from __future__ import annotations

import asyncio
from collections.abc import Callable
import logging
from typing import Any

from aioswitcher.bridge import SwitcherBase, SwitcherBridge

from homeassistant.core import HomeAssistant, callback

from .const import DATA_BRIDGE, DISCOVERY_TIME_SEC, DOMAIN

_LOGGER = logging.getLogger(__name__)


async def async_start_bridge(
    hass: HomeAssistant, on_device_callback: Callable[[SwitcherBase], Any]
) -> None:
    """Start switcher UDP bridge."""
    bridge = hass.data[DOMAIN][DATA_BRIDGE] = SwitcherBridge(on_device_callback)
    _LOGGER.debug("Starting Switcher bridge")
    await bridge.start()


async def async_stop_bridge(hass: HomeAssistant) -> None:
    """Stop switcher UDP bridge."""
    bridge: SwitcherBridge = hass.data[DOMAIN].get(DATA_BRIDGE)
    if bridge is not None:
        _LOGGER.debug("Stopping Switcher bridge")
        await bridge.stop()
        hass.data[DOMAIN].pop(DATA_BRIDGE)


async def async_discover_devices() -> dict[str, SwitcherBase]:
    """Discover Switcher devices."""
    _LOGGER.debug("Starting discovery")
    discovered_devices = {}

    @callback
    def on_device_data_callback(device: SwitcherBase) -> None:
        """Use as a callback for device data."""
        if device.device_id in discovered_devices:
            return

        discovered_devices[device.device_id] = device

    bridge = SwitcherBridge(on_device_data_callback)
    await bridge.start()
    await asyncio.sleep(DISCOVERY_TIME_SEC)
    await bridge.stop()

    _LOGGER.debug("Finished discovery, discovered devices: %s", len(discovered_devices))
    return discovered_devices
