"""In-app notifications listing + read state."""
from bson import ObjectId
from bson.errors import InvalidId
from fastapi import APIRouter, Depends, HTTPException

from deps import get_db, get_current_user
from notifications import serialize

router = APIRouter(prefix="/notifications", tags=["notifications"])


def _oid(s):
    try: return ObjectId(s)
    except InvalidId: raise HTTPException(status_code=400, detail="ID inválido")


@router.get("")
async def list_notifications(user: dict = Depends(get_current_user)):
    db = get_db()
    cur = db.notifications.find({"user_id": user["id"]}).sort("created_at", -1).limit(50)
    return [serialize(n) async for n in cur]


@router.get("/unread-count")
async def unread_count(user: dict = Depends(get_current_user)):
    db = get_db()
    n = await db.notifications.count_documents({"user_id": user["id"], "read": False})
    return {"count": n}


@router.post("/{nid}/read")
async def mark_read(nid: str, user: dict = Depends(get_current_user)):
    db = get_db()
    r = await db.notifications.update_one({"_id": _oid(nid), "user_id": user["id"]}, {"$set": {"read": True}})
    if r.matched_count == 0: raise HTTPException(status_code=404, detail="No encontrada")
    return {"ok": True}


@router.post("/read-all")
async def mark_all_read(user: dict = Depends(get_current_user)):
    db = get_db()
    await db.notifications.update_many({"user_id": user["id"], "read": False}, {"$set": {"read": True}})
    return {"ok": True}
