import asyncio
from logging import getLogger

from defence360agent.contracts.config import UserConfig
from defence360agent.contracts.messages import MessageType
from defence360agent.contracts.plugins import MessageSink, expect
from im360.simple_rpc.resident_socket import send_to_socket

logger = getLogger(__name__)


class Repeater(MessageSink):
    async def create_sink(self, loop):
        self._loop = loop

    @expect(MessageType.FilesUpdated)
    async def resend_to_generic_socket(self, msg):
        asyncio.create_task(
            send_to_socket(
                msg={
                    "method": "FILES_UPDATE",
                    "files_type": msg["files_type"],
                },
                wait_for_response=False,
            )
        )

    @expect(MessageType.ConfigUpdate)
    async def resend_config_update_to_generic_socket(self, msg):
        if isinstance(msg["conf"], UserConfig):
            return  # do nothing for non-root config updates
        asyncio.create_task(
            send_to_socket(
                msg={
                    "method": "UPDATE_RULES",
                },
                wait_for_response=False,
            )
        )
