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

app = FastAPI()

IST = pytz.timezone("Asia/Kolkata")

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

DATA = []


def is_today(time_str):
    try:
        dt = datetime.fromisoformat(time_str)
        print(f"Checking date: {dt.date()} against current date: {datetime.now(IST).date()}")
        return dt.date() == datetime.now(IST).date()
    except:
        return False


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

    global DATA

    # remove old date signals
    DATA = [d for d in DATA if is_today(d.get("time", ""))]

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

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

        # remove duplicate symbol
        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))), x.get("time", "")),
        reverse=True
    )

    return jsonable_encoder(DATA)


@app.get("/events")
def get_events():
    today_data = [d for d in DATA if is_today(d.get("time", ""))]
    return jsonable_encoder(today_data)


clients = []


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


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