from collections.abc import Generator
from typing import Any

import pytest
from loguru import logger
from pytest import LogCaptureFixture

from pydase import DataService
from pydase.data_service.callback_manager import CallbackManager


@pytest.fixture
def caplog(caplog: LogCaptureFixture) -> Generator[LogCaptureFixture, Any, None]:
    handler_id = logger.add(caplog.handler, format="{message}")
    yield caplog
    logger.remove(handler_id)


def emit(self: Any, parent_path: str, name: str, value: Any) -> None:
    if isinstance(value, DataService):
        value = value.serialize()

    print(f"{parent_path}.{name} = {value}")


CallbackManager.emit_notification = emit  # type: ignore