from fastapi import FastAPI, Request, WebSocket, WebSocketDisconnect
from fastapi.middleware.cors import CORSMiddleware
from fastapi.encoders import jsonable_encoder
import uvicorn

app = FastAPI()

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

DATA = []

@app.post("/events")
async def receive_event(request: Request):
    payload = await request.json()
    if isinstance(payload, dict):
        payload = [payload]

    for item in payload:
        if not isinstance(item, dict) or "symbol" not in item:
            continue

        item.setdefault("score", 0)
        item.setdefault("direction", "NEUTRAL")

        global DATA
        DATA = [d for d in DATA if d.get("symbol") != item["symbol"]]
        DATA.append(item)

    #DATA.sort(key=lambda x: abs(float(x.get("score", 0))), reverse=True)
    DATA.sort(
        key=lambda x: (abs(float(x["score"])), x["time"]),
        reverse=True
    )
    return jsonable_encoder(DATA)

@app.get("/events")
def get_events():
    return jsonable_encoder(DATA)


clients = []

@app.websocket("/ws")
async def websocket_endpoint(ws: WebSocket):
    await ws.accept()
    clients.append(ws)
    try:
        while True:
            await ws.receive_text()  # keep alive
    except WebSocketDisconnect:
        clients.remove(ws)

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