import logging
from typing import Any, Callable

from typing_extensions import Self

from webview.dom.element import Element

logger = logging.getLogger(__file__)


class DOMEvent:
    def __init__(self, event, element: Element) -> None:
        self.event = event
        self.__element = element
        self._items: list[Callable[..., Any]] = []

    def __add__(self, item: Callable[..., Any]) -> Self:
        self._items.append(item)
        self.__element.on(self.event, item)
        return self

    def __sub__(self, item: Callable[..., Any]) -> Self:
        self._items.remove(item)
        self.__element.off(self.event, item)
        return self

    def __iadd__(self, item: Callable[..., Any]) -> Self:
        self._items.append(item)
        self.__element.on(self.event, item)
        return self

    def __isub__(self, item: Callable[..., Any]) -> Self:
        if item in self._items:
            self._items.remove(item)
            self.__element.off(self.event, item)
        else:
            logger.warning(f'Event handler {item} not found')
        return self
