import json
import logging
import tempfile
from pathlib import Path

import pydase
from pydase.data_service.data_service_observer import DataServiceObserver
from pydase.data_service.state_manager import StateManager
from pydase.server.web_server.web_server import WebServer

logger = logging.getLogger(__name__)


def test_web_settings() -> None:
    class SubClass(pydase.DataService):
        name = "Hello"

    class ServiceClass(pydase.DataService):
        def __init__(self) -> None:
            super().__init__()
            self.attr_1 = SubClass()
            self.added = "added"

    service_instance = ServiceClass()
    state_manager = StateManager(service_instance)
    observer = DataServiceObserver(state_manager)
    with tempfile.TemporaryDirectory() as tmp:
        web_settings = {
            "attr_1": {"displayName": "Attribute", "display": False},
            "attr_1.name": {"displayName": "Attribute name", "display": True},
        }
        web_settings_file = Path(tmp) / "web_settings.json"

        with web_settings_file.open("w") as file:
            file.write(json.dumps(web_settings))

        server = WebServer(
            observer,
            host="0.0.0.0",
            port=8001,
            generate_web_settings=True,
            config_dir=Path(tmp),
        )
        new_web_settings = server.web_settings

        # existing entries are not overwritten, new entries are appended
        assert new_web_settings == {
            **web_settings,
            "added": {"displayName": "added", "display": True},
        }
        assert json.loads(web_settings_file.read_text()) == {
            **web_settings,
            "added": {"displayName": "added", "display": True},
        }