from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy.orm import Session

from app.database import get_db
from app.dependencies import require_admin_token
from app.models import User
from app.schemas import (
    AdminNotificationIdRequest,
    AdminNotificationListResponse,
    AdminNotificationUnreadCountResponse,
    Message,
)
from app.services.admin_notification_service import (
    clear_all_admin_notifications,
    count_unread_admin_notifications,
    delete_admin_notification,
    list_admin_notifications,
    mark_admin_notification_read,
    mark_all_admin_notifications_read,
    serialize_admin_notification,
)

router = APIRouter(tags=["admin-activity-notifications"])


@router.get(
    "/list-admin-notifications",
    response_model=AdminNotificationListResponse,
    summary="List admin inbox notifications (reward claims, track submits, community activity)",
)
def list_admin_notifications_route(
    db: Session = Depends(get_db),
    _: User = Depends(require_admin_token),
):
    rows = list_admin_notifications(db)
    serialized = [serialize_admin_notification(n) for n in rows]
    return AdminNotificationListResponse(total=len(serialized), notifications=serialized)


@router.get(
    "/admin-notifications-unread-count",
    response_model=AdminNotificationUnreadCountResponse,
    summary="Unread count for admin activity notifications bell",
)
def admin_notifications_unread_count(
    db: Session = Depends(get_db),
    _: User = Depends(require_admin_token),
):
    return AdminNotificationUnreadCountResponse(unread_count=count_unread_admin_notifications(db))


@router.post(
    "/mark-admin-notification-read",
    response_model=Message,
    summary="Mark one admin activity notification as read",
)
def mark_admin_notification_read_route(
    body: AdminNotificationIdRequest,
    db: Session = Depends(get_db),
    _: User = Depends(require_admin_token),
):
    row = mark_admin_notification_read(db, body.notification_id)
    if not row:
        raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Notification not found")
    return Message(message="Notification marked as read")


@router.post(
    "/mark-all-admin-notifications-read",
    response_model=Message,
    summary="Mark all admin activity notifications as read",
)
def mark_all_admin_notifications_read_route(
    db: Session = Depends(get_db),
    _: User = Depends(require_admin_token),
):
    count = mark_all_admin_notifications_read(db)
    return Message(message=f"Marked {count} notification(s) as read")


@router.post(
    "/delete-admin-notification",
    response_model=Message,
    summary="Permanently delete one admin activity notification",
)
def delete_admin_notification_route(
    body: AdminNotificationIdRequest,
    db: Session = Depends(get_db),
    _: User = Depends(require_admin_token),
):
    if not delete_admin_notification(db, body.notification_id):
        raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Notification not found")
    return Message(message="Notification deleted")


@router.post(
    "/clear-all-admin-notifications",
    response_model=Message,
    summary="Permanently delete all admin activity notifications",
)
def clear_all_admin_notifications_route(
    db: Session = Depends(get_db),
    _: User = Depends(require_admin_token),
):
    count = clear_all_admin_notifications(db)
    return Message(message=f"Cleared {count} notification(s)")
