
from fastapi import HTTPException

from app.modules.user.user_service import UserService

from app.utils.jwt import create_access_token

from app.utils.google_auth import verify_google_token


class UserController:

    def __init__(self):

        self.user_service = UserService()

  
    # EMAIL REGISTER
    async def email_register(self, request):

        try:

            existing_user = await self.user_service.get_user_by_email(
                request.email
            )

            if existing_user:

                raise HTTPException(
                    status_code=400,
                    detail="Email already registered"
                )

            # Temporary hardcoded OTP

            return {
                "success": True,
                "message": "OTP sent successfully",
                "otp": "1234"
            }

        except HTTPException:

            raise

        except Exception as e:

            print(
                "Email Register Error:",
                str(e)
            )

            raise HTTPException(
                status_code=500,
                detail="Internal server error"
            )

  
    # EMAIL VERIFY OTP
    async def email_verify_otp(self, request):

        try:

            # Temporary hardcoded OTP
            if request.otpCode != "1234":

                raise HTTPException(
                    status_code=400,
                    detail="Invalid OTP"
                )

            result = await self.user_service.register_with_email(
                email=request.email,
                password=request.password
            )

            if not result["success"]:

                raise HTTPException(
                    status_code=400,
                    detail=result["message"]
                )

            user = result["user"]

            token = create_access_token(
                {
                    "_id": str(user["_id"]),
                    "email": user.get("email")
                }
            )

            return {
                "success": True,
                "message": "Registration Successful",
                "token_type": "Bearer",
                "access_token": token,
                "user": {
                    "_id": str(user["_id"]),
                    "email": user.get("email"),
                    "name": user.get("name"),
                    "profile_image": user.get("profile_image")
                }
            }

        except HTTPException:

            raise

        except Exception as e:

            print(
                "Email Verify OTP Error:",
                str(e)
            )

            raise HTTPException(
                status_code=500,
                detail="Internal server error"
            )

  
    # EMAIL LOGIN
    async def email_login(self, request):

        try:

            result = await self.user_service.login_with_email(
                email=request.email,
                password=request.password
            )

            
            
            # User not found / invalid password
            # should NOT become Internal Server Error
            if not result["success"]:

                raise HTTPException(
                    status_code=401,
                    detail=result["message"]
                )

            user = result["user"]

            token = create_access_token(
                {
                    "_id": str(user["_id"]),
                    "email": user.get("email")
                }
            )

            return {
                "success": True,
                "message": "Login Successful",
                "token_type": "Bearer",
                "access_token": token,
                "user": {
                    "_id": str(user["_id"]),
                    "email": user.get("email"),
                    "name": user.get("name"),
                    "profile_image": user.get("profile_image")
                }
            }

        except HTTPException:

            raise

        except Exception as e:

            print(
                "Email Login Error:",
                str(e)
            )

            raise HTTPException(
                status_code=500,
                detail="Internal server error"
            )

    
    # GOOGLE LOGIN
    async def google_login(self, request):

        try:

            google_user = verify_google_token(
                request.id_token
            )

            if not google_user:

                raise HTTPException(
                    status_code=401,
                    detail="Invalid Google token"
                )

            result = await self.user_service.login_with_google(
                google_id=google_user["google_id"],
                email=google_user["email"],
                name=google_user.get("name"),
                profile_image=google_user.get("profile_image")
            )

            if not result["success"]:

                raise HTTPException(
                    status_code=401,
                    detail=result["message"]
                )

            user = result["user"]

            token = create_access_token(
                {
                    "_id": str(user["_id"]),
                    "email": user.get("email"),
                    "google_id": user.get("google_id")
                }
            )

            return {
                "success": True,
                "message": "Google Login Successful",
                "token_type": "Bearer",
                "access_token": token,
                "user": {
                    "_id": str(user["_id"]),
                    "email": user.get("email"),
                    "name": user.get("name"),
                    "profile_image": user.get("profile_image")
                }
            }

        except HTTPException:

            raise

        except Exception as e:

            print(
                "Google Login Error:",
                str(e)
            )

            raise HTTPException(
                status_code=500,
                detail="Internal server error"
            )
            
        # FORGOT PASSWORD
    async def forgot_password(self, request):

        try:

            result = await self.user_service.forgot_password(
                email=request.email
            )

            if not result["success"]:

                raise HTTPException(
                    status_code=404,
                    detail=result["message"]
                )

            return {
                "success": True,
                "message": result["message"],
                "otp": result["otp"]
            }

        except HTTPException:

            raise

        except Exception as e:

            print(
                "Forgot Password Error:",
                str(e)
            )

            raise HTTPException(
                status_code=500,
                detail="Internal server error"
            )


    # RESET PASSWORD
    async def reset_password(self, request):

        try:

            result = await self.user_service.reset_password(
                email=request.email,
                otp_code=request.otpCode,
                new_password=request.new_password
            )

            if not result["success"]:

                if result["message"] == "User not found":

                    raise HTTPException(
                        status_code=404,
                        detail=result["message"]
                    )

                if result["message"] == "Invalid OTP":

                    raise HTTPException(
                        status_code=400,
                        detail=result["message"]
                    )

                if result["message"] == "User account is inactive":

                    raise HTTPException(
                        status_code=401,
                        detail=result["message"]
                    )

                raise HTTPException(
                    status_code=400,
                    detail=result["message"]
                )

            return {
                "success": True,
                "message": "Password reset successfully"
            }

        except HTTPException:

            raise

        except Exception as e:

            print(
                "Reset Password Error:",
                str(e)
            )

            raise HTTPException(
                status_code=500,
                detail="Internal server error"
            )

    async def me(self, current_user):
         
          return{
              "success": True,
              "user": {
                  "_id": str(current_user["_id"]),
                  "email": current_user.get("email"),
                  "name": current_user.get("name"),
                  "profile_image": current_user.get("profile_image")
              }
          }
          
    
    async def delete_account(
        self,
        current_user
    ):
        
        try:
            
            user_id = str(
                current_user["_id"]
            )

            result = await self.user_service.soft_delete_account(
                user_id
            )
            
            if not result["success"]:
                
                if result["message"] == "User not found":

                    raise HTTPException(
                        status_code=404,
                        detail=result["message"]
                    )
                    
                if result["message"] == "User account is already inactive":
                    
                    raise HTTPException(
                        status_code=400,
                        detail=result["message"]
                    )
                raise HTTPException(
                    status_code=400,
                    detail=result["message"]
                )
            
            return {
                "success": True,
                "message": "User account deleted successfully"
            }
        
        except HTTPException:
            
            raise
        
        except Exception as e:
            
            print(
                "Delete Account Error:",
                str(e)
            )
            
            raise HTTPException(
                status_code=500,
                detail="Internal server error"
            )

   
    
       