"""Base entity for Traccar Server."""

from typing import Any, override

from pytraccar import DeviceModel, GeofenceModel, PositionModel

from homeassistant.helpers.device_registry import DeviceInfo
from homeassistant.helpers.dispatcher import async_dispatcher_connect
from homeassistant.helpers.update_coordinator import CoordinatorEntity

from .const import DOMAIN
from .coordinator import TraccarServerCoordinator


class TraccarServerEntity(CoordinatorEntity[TraccarServerCoordinator]):
    """Base entity for Traccar Server."""

    def __init__(
        self,
        coordinator: TraccarServerCoordinator,
        device: DeviceModel,
    ) -> None:
        """Initialize the Traccar Server entity."""
        super().__init__(coordinator)
        self.device_id = device["id"]
        self._attr_device_info = DeviceInfo(
            identifiers={(DOMAIN, device["uniqueId"])},
            model=device["model"],
            name=device["name"],
        )
        self._attr_unique_id = device["uniqueId"]

    @property
    @override
    def available(self) -> bool:
        """Return True if entity is available."""
        return bool(self.coordinator.data and self.device_id in self.coordinator.data)

    @property
    def traccar_device(self) -> DeviceModel:
        """Return the device."""
        return self.coordinator.data[self.device_id]["device"]

    @property
    def traccar_geofence(self) -> GeofenceModel | None:
        """Return the geofence."""
        return self.coordinator.data[self.device_id]["geofence"]

    @property
    def traccar_position(self) -> PositionModel:
        """Return the position."""
        return self.coordinator.data[self.device_id]["position"]

    @property
    def traccar_attributes(self) -> dict[str, Any]:
        """Return the attributes."""
        return self.coordinator.data[self.device_id]["attributes"]

    @override
    async def async_added_to_hass(self) -> None:
        """Entity added to hass."""
        self.async_on_remove(
            async_dispatcher_connect(
                self.hass,
                f"{DOMAIN}_{self.device_id}",
                self.async_write_ha_state,
            )
        )
        await super().async_added_to_hass()
