class BulkQuestionAction(BaseModel):
    """One editorial action applied to a checked set in the question manager."""

    question_ids: list[int]
    action: Literal["category", "difficulty", "share", "delete"]
    category_id: int | None = None
    difficulty: Literal["easy", "medium", "hard"] | None = None
    shared: int | None = None


@router.post("/bulk")
def bulk_question_action(
    data: BulkQuestionAction,
    db: Session = Depends(get_db),
    current_user: User = Depends(require_moderator),
):
    """Apply one editorial action to up to 500 checked questions."""
    ids = list(dict.fromkeys(data.question_ids))
    if not ids:
        raise HTTPException(400, "No questions selected")
    if len(ids) > 500:
        raise HTTPException(400, "Select at most 500 questions per action")

    rows = db.query(Question).filter(Question.id.in_(ids))
    if data.action == "category":
        if data.category_id is not None and not db.get(QuestionCategory, data.category_id):
            raise HTTPException(404, "Category not found")
        updated = rows.update({"question_category_id": data.category_id}, synchronize_session=False)
    elif data.action == "difficulty":
        updated = rows.update({"difficulty": data.difficulty}, synchronize_session=False)
    elif data.action == "share":
        updated = rows.update({"is_shared": 1 if data.shared else 0}, synchronize_session=False)
    else:  # delete
        # Extra category links cascade with the question rows.
        db.query(QuestionCategoryLink).filter(
            QuestionCategoryLink.question_id.in_(ids)).delete(synchronize_session=False)
        updated = rows.delete(synchronize_session=False)
    db.commit()
    return {"updated": updated, "action": data.action}


@router.get("/manage/summary")
def question_manager_summary(
    db: Session = Depends(get_db),
    current_user: User = Depends(require_moderator),
):
    """Editorial health counters shown as one-click filters in the question manager."""
    base = db.query(func.count(Question.id))
    blank = ("", " ")
    return {
        "total": base.scalar() or 0,
        "uncategorized": base.filter(Question.question_category_id.is_(None)).scalar() or 0,
        "no_difficulty": base.filter(Question.difficulty.is_(None)).scalar() or 0,
        "no_explanation": base.filter(
            or_(Question.explanation.is_(None), Question.explanation.in_(blank))).scalar() or 0,
        "private": base.filter(Question.is_shared == 0).scalar() or 0,
        "mine": base.filter(Question.user_id == current_user.id).scalar() or 0,
    }


