from fastapi import APIRouter, Depends
from pydantic import BaseModel, EmailStr

from app.modules.user.user_controller import UserController
from app.utils.jwt import get_current_user


router = APIRouter(
    prefix="/user",
    tags=["User"]
)


controller = UserController()

# EMAIL REGISTER
class EmailRegisterRequest(BaseModel):
    email: EmailStr



# EMAIL VERIFY OTP
class EmailVerifyOtpRequest(BaseModel):
    email: EmailStr
    password: str
    otpCode: str



# EMAIL LOGIN
class EmailLoginRequest(BaseModel):
    email: EmailStr
    password: str



# GOOGLE LOGIN
class GoogleLoginRequest(BaseModel):
    id_token: str


# FORGOT PASSWORD
class ForgotPasswordRequest(BaseModel):
    email: EmailStr
    

# RESET PASSWORD
class ResetPasswordRequest(BaseModel):
    email: EmailStr
    otpCode: str
    new_password: str
    


# EMAIL REGISTER ROUTE
@router.post("/email-register")
async def email_register(request: EmailRegisterRequest):

    return await controller.email_register(request)



# EMAIL VERIFY OTP ROUTE
@router.post("/email-verify-otp")
async def email_verify_otp(request: EmailVerifyOtpRequest):

    return await controller.email_verify_otp(request)



# EMAIL LOGIN ROUTE
@router.post("/email-login")
async def email_login(request: EmailLoginRequest):

    return await controller.email_login(request)


# GOOGLE LOGIN ROUTE
@router.post("/google-login")
async def google_login(request: GoogleLoginRequest):

    return await controller.google_login(request)


# FORGOT PASSWORD
@router.post("/forgot-password")
async def forgot_password(
    request: ForgotPasswordRequest
):

    return await controller.forgot_password(
        request
    )


#RESET PASSWORD
@router.post("/reset-password")
async def reset_password(
    request: ResetPasswordRequest
):

    return await controller.reset_password(
        request
    )


#ABOUT ME
@router.get("/me")
async def get_me(
    current_user=Depends(get_current_user)
):
    return await controller.me(current_user)

#DELETE ACCOUNT
@router.delete("/account")
async def delete_account(
    current_user=Depends(get_current_user)
):
    
    return await controller.delete_account(
        current_user
    )