import json
from channels.generic.websocket import AsyncWebsocketConsumer

class StaffConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        user = self.scope.get("user")
        if not user or not user.is_authenticated or not user.is_staff:
            await self.close()
            return
        self.user_group = f"staff_user_{user.id}"
        self.broadcast_group = "staff_broadcast"
        await self.channel_layer.group_add(self.user_group, self.channel_name)
        await self.channel_layer.group_add(self.broadcast_group, self.channel_name)
        await self.accept()
        await self.send_json({"type":"hello","message":"connected"})

    async def disconnect(self, code):
        try:
            await self.channel_layer.group_discard(self.user_group, self.channel_name)
            await self.channel_layer.group_discard(self.broadcast_group, self.channel_name)
        except Exception:
            pass

    async def receive(self, text_data=None, bytes_data=None):
        # Keep minimal; client can send ping
        if not text_data:
            return
        try:
            payload = json.loads(text_data)
        except Exception:
            return
        if payload.get("type") == "ping":
            await self.send_json({"type":"pong"})

    async def send_json(self, data):
        await self.send(text_data=json.dumps(data))

    async def staff_event(self, event):
        # event: {"type":"staff.event","payload":{...}}
        payload = event.get("payload") or {}
        await self.send_json(payload)
