"""Shared FastAPI dependencies: DB session, current user, rate limiting (spec §51)."""
from __future__ import annotations

from typing import Optional

from fastapi import Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer
from slowapi import Limiter
from slowapi.util import get_remote_address
from sqlalchemy.orm import Session

from app.core.db import get_db
from app.core.security import decode_token
from app.models import User

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/v1/auth/login", auto_error=False)
limiter = Limiter(key_func=get_remote_address)


def get_current_user(token: Optional[str] = Depends(oauth2_scheme), db: Session = Depends(get_db)) -> User:
    credentials_error = HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Could not validate credentials")
    if token is None:
        raise credentials_error
    payload = decode_token(token)
    if payload is None or payload.get("type") != "access":
        raise credentials_error
    user = db.get(User, payload.get("sub"))
    if user is None or not user.is_active:
        raise credentials_error
    return user


def get_current_user_optional(token: Optional[str] = Depends(oauth2_scheme), db: Session = Depends(get_db)) -> Optional[User]:
    if token is None:
        return None
    try:
        return get_current_user(token, db)
    except HTTPException:
        return None
