"""Switch platform for AdGuard Control Hub integration.""" import logging from typing import Any from homeassistant.components.switch import SwitchEntity from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.update_coordinator import CoordinatorEntity from . import AdGuardControlHubCoordinator from .api import AdGuardHomeAPI from .const import DOMAIN, ICON_PROTECTION, ICON_PROTECTION_OFF, ICON_CLIENT, MANUFACTURER _LOGGER = logging.getLogger(__name__) async def async_setup_entry( hass: HomeAssistant, config_entry: ConfigEntry, async_add_entities: AddEntitiesCallback, ) -> None: """Set up AdGuard Control Hub switch platform.""" coordinator = hass.data[DOMAIN][config_entry.entry_id]["coordinator"] api = hass.data[DOMAIN][config_entry.entry_id]["api"] entities = [AdGuardProtectionSwitch(coordinator, api)] # Add client switches if clients exist for client_name in coordinator.clients.keys(): entities.append(AdGuardClientSwitch(coordinator, api, client_name)) async_add_entities(entities) class AdGuardBaseSwitch(CoordinatorEntity, SwitchEntity): """Base class for AdGuard switches.""" def __init__(self, coordinator: AdGuardControlHubCoordinator, api: AdGuardHomeAPI): """Initialize the switch.""" super().__init__(coordinator) self.api = api self._attr_device_info = { "identifiers": {(DOMAIN, f"{api.host}:{api.port}")}, "name": f"AdGuard Control Hub ({api.host})", "manufacturer": MANUFACTURER, "model": "AdGuard Home", } class AdGuardProtectionSwitch(AdGuardBaseSwitch): """Switch to control global AdGuard protection.""" def __init__(self, coordinator: AdGuardControlHubCoordinator, api: AdGuardHomeAPI): """Initialize the switch.""" super().__init__(coordinator, api) self._attr_unique_id = f"{api.host}_{api.port}_protection" self._attr_name = "AdGuard Protection" @property def is_on(self) -> bool | None: """Return true if protection is enabled.""" return self.coordinator.protection_status.get("protection_enabled", False) @property def icon(self) -> str: """Return the icon for the switch.""" return ICON_PROTECTION if self.is_on else ICON_PROTECTION_OFF async def async_turn_on(self, **kwargs: Any) -> None: """Turn on AdGuard protection.""" try: await self.api.set_protection(True) await self.coordinator.async_request_refresh() except Exception as err: _LOGGER.error("Failed to enable AdGuard protection: %s", err) raise async def async_turn_off(self, **kwargs: Any) -> None: """Turn off AdGuard protection.""" try: await self.api.set_protection(False) await self.coordinator.async_request_refresh() except Exception as err: _LOGGER.error("Failed to disable AdGuard protection: %s", err) raise class AdGuardClientSwitch(AdGuardBaseSwitch): """Switch to control client-specific protection.""" def __init__( self, coordinator: AdGuardControlHubCoordinator, api: AdGuardHomeAPI, client_name: str, ): """Initialize the switch.""" super().__init__(coordinator, api) self.client_name = client_name self._attr_unique_id = f"{api.host}_{api.port}_client_{client_name}" self._attr_name = f"AdGuard {client_name}" self._attr_icon = ICON_CLIENT @property def is_on(self) -> bool | None: """Return true if client protection is enabled.""" client = self.coordinator.clients.get(self.client_name, {}) return client.get("filtering_enabled", True) async def async_turn_on(self, **kwargs: Any) -> None: """Enable protection for this client.""" try: client = await self.api.get_client_by_name(self.client_name) if client: update_data = { "name": self.client_name, "data": {**client, "filtering_enabled": True} } await self.api.update_client(update_data) await self.coordinator.async_request_refresh() except Exception as err: _LOGGER.error("Failed to enable protection for %s: %s", self.client_name, err) raise async def async_turn_off(self, **kwargs: Any) -> None: """Disable protection for this client.""" try: client = await self.api.get_client_by_name(self.client_name) if client: update_data = { "name": self.client_name, "data": {**client, "filtering_enabled": False} } await self.api.update_client(update_data) await self.coordinator.async_request_refresh() except Exception as err: _LOGGER.error("Failed to disable protection for %s: %s", self.client_name, err) raise