from fastapi import APIRouter, File, UploadFile, HTTPException, Depends
from src.models.user_schema import EmailRequest, OTPVerify, Users, Token, UserLogin, ResetPasswordRequest
from src.service.email_service import generate_otp, send_otp_mail, verify_otp
from src.controllers.user_service import is_user_exist, save_user, get_user_form, get_current_user
from src.service.image_service import save_file
from src.controllers.auth_service import login, update_password
from fastapi.security import OAuth2PasswordBearer

router = APIRouter()

@router.post("/request-otp")
def request_otp(data: EmailRequest):
    otp = generate_otp(data.email)
    send_otp_mail(data.email, otp)
    return {"message": "OTP sent"}

@router.post("/verify-otp")
def verify_user_otp(data: OTPVerify):
    result = verify_otp(data.email, data.otp)
    if not result["verified"]:
        raise HTTPException(status_code=400, detail=result["reason"])
    return {"message": "OTP verified successfully"}

@router.post("/register")
def register_user(user: Users = Depends(get_user_form),
    profile_image: UploadFile = File(...)):

    if is_user_exist(user.email):
        raise HTTPException(status_code=400, detail="User already exists")

    image_path = save_file(profile_image, 'users')
    user_data = user.model_dump()

    save_user(user_data, image_path)
    return {"message": "User registered successfully"}


@router.post("/login", response_model=Token)
def user_login(user: UserLogin):
    return login(user)


@router.post("/reset-password")
def reset_password_route(request: ResetPasswordRequest):
    if not is_user_exist(request.email):
        raise HTTPException(status_code=404, detail="Enter valid email!")
    return update_password(request)


oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

@router.get("/user-detail")
async def read_users_me(token: str = Depends(oauth2_scheme)):
    return get_current_user(token)

