from fastapi import Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer
from jose import JWTError, jwt
from utils.auth import SECRET_KEY, ALGORITHM
from pydantic import BaseModel

# Este endpoint se usará en Swagger UI para obtener el token
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/login")

# Modelo de los datos contenidos en el token
class TokenData(BaseModel):
    email: str
    role: str

# Función que valida el token y devuelve al usuario actual
async def get_current_user(token: str = Depends(oauth2_scheme)) -> TokenData:
    try:
        payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
        email: str = payload.get("email")
        role: str = payload.get("role")

        # Validación mínima del payload
        if email is None or role is None:
            raise HTTPException(
                status_code=status.HTTP_401_UNAUTHORIZED,
                detail="Token inválido o incompleto",
                headers={"WWW-Authenticate": "Bearer"},
            )

        return TokenData(email=email, role=role)

    except JWTError:
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Token inválido",
            headers={"WWW-Authenticate": "Bearer"},
        )
