from __future__ import annotations

import json
import logging
from datetime import datetime, timezone

from fastapi import APIRouter, WebSocket, WebSocketDisconnect

from price.cache import price_cache
from websocket.manager import ws_manager

logger = logging.getLogger(__name__)
router = APIRouter()


@router.websocket("/ws/prices")
async def ws_prices(websocket: WebSocket) -> None:
    await ws_manager.connect(websocket)
    try:
        # إرسال لقطة فورية عند الاتصال
        snapshot = price_cache.get_all()
        await websocket.send_text(json.dumps({
            "type": "snapshot",
            "data": snapshot,
            "timestamp": datetime.now(timezone.utc).isoformat(),
        }))

        # الاحتفاظ بالاتصال مفتوحاً — البث يأتي من محدِّث الأسعار
        while True:
            msg = await websocket.receive_text()
            if msg == "ping":
                await websocket.send_text(json.dumps({"type": "pong"}))

    except WebSocketDisconnect:
        pass
    except Exception as e:
        logger.error(f"خطأ في /ws/prices: {e}")
    finally:
        ws_manager.disconnect(websocket)
