"""Notification endpoints.

Endpoints
---------
GET    /notifications              — list user notifications (paginated)
GET    /notifications/unread-count — count of unread notifications
PATCH  /notifications/{id}/read   — mark one notification as read
POST   /notifications/read-all    — mark all as read
"""

import uuid

from fastapi import APIRouter, Depends, Query
from sqlalchemy.orm import Session

from app.database import get_db
from app.dependencies.auth import get_current_user
from app.domain.unit_of_work import UnitOfWork
from app.models.user import User
from app.schemas.notification import NotificationOut, UnreadCountOut
from app.services.notification_service import (
    list_notifications,
    mark_as_read,
    mark_all_as_read,
    get_unread_count,
)

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


# ---------------------------------------------------------------------------
# GET /notifications  —  list (paginated)
# ---------------------------------------------------------------------------


@router.get("", response_model=list[NotificationOut])
def list_notifications_endpoint(
    offset: int = Query(0, ge=0),
    limit: int = Query(20, ge=1, le=100),
    db: Session = Depends(get_db),
    current_user: User = Depends(get_current_user),
):
    """Return paginated notifications for the current user, newest first."""
    return list_notifications(db, current_user.id, offset=offset, limit=limit)


# ---------------------------------------------------------------------------
# GET /notifications/unread-count
# ---------------------------------------------------------------------------


@router.get("/unread-count", response_model=UnreadCountOut)
def unread_count(
    db: Session = Depends(get_db),
    current_user: User = Depends(get_current_user),
):
    """Return the number of unread notifications for the current user."""
    count = get_unread_count(db, current_user.id)
    return UnreadCountOut(unread_count=count)


# ---------------------------------------------------------------------------
# PATCH /notifications/{id}/read
# ---------------------------------------------------------------------------


@router.patch("/{notification_id}/read", response_model=NotificationOut)
def read_notification(
    notification_id: uuid.UUID,
    db: Session = Depends(get_db),
    current_user: User = Depends(get_current_user),
):
    """Mark a single notification as read."""
    with UnitOfWork(db) as uow:
        notif = mark_as_read(db, notification_id, current_user.id)
        uow.commit()
    return notif


# ---------------------------------------------------------------------------
# POST /notifications/read-all
# ---------------------------------------------------------------------------


@router.post("/read-all")
def read_all_notifications(
    db: Session = Depends(get_db),
    current_user: User = Depends(get_current_user),
):
    """Mark all notifications for the current user as read."""
    with UnitOfWork(db) as uow:
        count = mark_all_as_read(db, current_user.id)
        uow.commit()
    return {"detail": f"Marked {count} notifications as read"}
