from fastapi import APIRouter, Depends, HTTPException, status
from src.presentation.api.v1.auth.schemas import LoginRequest, TokenResponse
from src.application.use_cases.authenticate_user import AuthenticateUserUseCase
from src.core.exceptions import InvalidCredentialsException

# Swappable components DB interface
from src.infrastructure.repositories.sql_user_repository import SqlUserRepository
from src.infrastructure.database.connection import get_db
from sqlalchemy.orm import Session

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

def get_auth_use_case(db: Session = Depends(get_db)) -> AuthenticateUserUseCase:
    """Dependency Injection injecting SQL repo explicitly for staging/prod mode"""
    repo = SqlUserRepository(db_session=db)
    return AuthenticateUserUseCase(user_repo=repo)

@router.post("/login", response_model=TokenResponse)
def login(request: LoginRequest, use_case: AuthenticateUserUseCase = Depends(get_auth_use_case)):
    try:
        token = use_case.execute(email=request.email, base_password=request.password)
        return TokenResponse(access_token=token)
    except InvalidCredentialsException as e:
        raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=e.message)
    except Exception as e:
        import traceback
        from src.core.logger import get_logger
        get_logger().error(f"Unexpected error in login: {e}\n{traceback.format_exc()}")
        raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="Internal server error")
