from functools import wraps

from fastapi import HTTPException, Request, status
from sqlalchemy.orm import Session

from .models import User


def current_user(request: Request, db: Session) -> User | None:
    user_id = request.session.get("user_id")
    if not user_id:
        return None
    return db.get(User, int(user_id))


def require_user(request: Request, db: Session) -> User:
    user = current_user(request, db)
    if not user or not user.is_active:
        raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Sesión no válida")
    return user


def require_roles(user: User, *roles: str) -> None:
    if user.role not in roles:
        raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="No autorizado")


def can_manage_evaluation(user: User, evaluation, db: Session) -> bool:
    if user.role in {"admin", "director", "evaluacion"}:
        return True
    if user.role != "docente":
        return False
    from .models import TeacherAssignment

    assignment = (
        db.query(TeacherAssignment)
        .filter(
            TeacherAssignment.teacher_id == user.id,
            TeacherAssignment.section_id == evaluation.section_id,
            TeacherAssignment.subject_id == evaluation.subject_id,
        )
        .first()
    )
    return assignment is not None
