from fastapi import APIRouter, Depends, HTTPException, Request, status
from sqlalchemy.ext.asyncio import AsyncSession

from src.core.config import settings
from src.db.session import get_db
from src.domain.schemas import LoginRequest, RefreshRequest, Token
from src.services.auth_service import AuthService

# if not settings.DEBUG:
#     from raisa_fastapi_protected_api import UserInfo, get_user_dependency

router = APIRouter(prefix="/auth", tags=["auth"])


# if settings.DEBUG:

@router.post("/login", response_model=Token)
async def login(
    login_data: LoginRequest,
    db: AsyncSession = Depends(get_db),
):
    auth_service = AuthService(db)
    token = await auth_service.authenticate_user(login_data.username, login_data.password)
    if not token:
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Неверное имя пользователя или пароль",
            headers={"WWW-Authenticate": "Bearer"},
        )
    return token

# else:

#     @router.post("/login", response_model=Token)
#     async def login(
#         login_data: LoginRequest,
#         db: AsyncSession = Depends(get_db),
#         user: UserInfo = Depends(get_user_dependency),
#     ):
#         auth_service = AuthService(db)
#         token = await auth_service.authenticate_user_via_email(user.email)
#         if not token:
#             raise HTTPException(
#                 status_code=status.HTTP_401_UNAUTHORIZED,
#                 detail="Неверное имя пользователя или пароль",
#                 headers={"WWW-Authenticate": "Bearer"},
#             )
#         return token


@router.post("/login-form", response_model=Token)
async def login_form(request: Request, db: AsyncSession = Depends(get_db)):
    form = await request.form()
    username = form.get("username")
    password = form.get("password")
    if not username or not password:
        raise HTTPException(
            status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
            detail="username/password required",
        )
    auth_service = AuthService(db)
    token = await auth_service.authenticate_user(username, password)
    if not token:
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Неверное имя пользователя или пароль",
        )
    return token


@router.post("/refresh", response_model=Token)
async def refresh_token(
    refresh_data: RefreshRequest,
    db: AsyncSession = Depends(get_db),
):
    auth_service = AuthService(db)
    token = await auth_service.refresh_token(refresh_data.refresh_token)
    if not token:
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Недействительный refresh токен",
            headers={"WWW-Authenticate": "Bearer"},
        )
    return token
