from fastapi import FastAPI, WebSocket, WebSocketDisconnect, Request
from fastapi.responses import JSONResponse
import uvicorn
from typing import List

app = FastAPI()

class ConnectionManager:
    def __init__(self):
        self.active: List[WebSocket] = []

    async def connect(self, websocket: WebSocket):
        await websocket.accept()
        self.active.append(websocket)

    def disconnect(self, websocket: WebSocket):
        if websocket in self.active:
            self.active.remove(websocket)

    async def broadcast(self, message: dict):
        dead = []
        for ws in list(self.active):
            try:
                await ws.send_json(message)
            except Exception:
                dead.append(ws)
        for ws in dead:
            self.disconnect(ws)

manager = ConnectionManager()


@app.get("/")
async def root():
    return JSONResponse({"status": "broker running"})


@app.post("/events")
async def receive_event(request: Request):
    payload = await request.json()
    await manager.broadcast(payload)
    return JSONResponse({"ok": True})


@app.post("/oi_summary")
async def receive_oi_summary(request: Request):
    # Example static data — or replace with real logic
    
    payload = await request.json()
    await manager.broadcast(payload)
    return JSONResponse(payload)


@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
    await manager.connect(websocket)
    try:
        while True:
            data = await websocket.receive_text()
            await websocket.send_text("pong")
    except WebSocketDisconnect:
        manager.disconnect(websocket)
    except Exception:
        manager.disconnect(websocket)


if __name__ == "__main__":
    uvicorn.run("broker:app", host="0.0.0.0", port=8000, reload=True)
