from fastapi import HTTPException

from app.modules.user.user_service import UserService
from app.utils.jwt import create_access_token


class UserController:

    def __init__(self):
        self.user_service = UserService()

    async def register(
        self,
        request
    ):

        try:

            existing_user = await self.user_service.get_user_by_phone(
                request.phone
            )

            if existing_user:
                raise HTTPException(
                    status_code=400,
                    detail="User already exists"
                )

            # Temporary Hardcoded OTP
            return {
                "success": True,
                "message": "OTP sent successfully",
                "otp": "1234"
            }

        except HTTPException:
            raise

        except Exception as e:
            raise HTTPException(
                status_code=500,
                detail=str(e)
            )

    async def verify_otp(
        self,
        request
    ):

        try:

            if request.otpCode != "1234":
                raise HTTPException(
                    status_code=400,
                    detail="Invalid OTP"
                )

            result = await self.user_service.register_user(
                request.phone,
                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"]),
                    "phone": user["phone"]
                }
            )

            return {
                "success": True,
                "message": "Registration Successful",
                "token_type": "Bearer",
                "access_token": token,
                "user": {
                    "_id": str(user["_id"]),
                    "phone": user["phone"]
                }
            }

        except HTTPException:
            raise

        except Exception as e:
            raise HTTPException(
                status_code=500,
                detail=str(e)
            )

    async def login(
        self,
        request
    ):

        try:

            result = await self.user_service.login_user(
                request.phone,
                request.password
            )

            if not result["success"]:
                raise HTTPException(
                    status_code=401,
                    detail=result["message"]
                )

            user = result["user"]

            token = create_access_token(
                {
                    "_id": str(user["_id"]),
                    "phone": user["phone"]
                }
            )

            return {
                "success": True,
                "message": "Login Successful",
                "token_type": "Bearer",
                "access_token": token,
                "user": {
                    "_id": str(user["_id"]),
                    "phone": user["phone"]
                }
            }

        except HTTPException:
            raise

        except Exception as e:
            raise HTTPException(
                status_code=500,
                detail=str(e)
            )
    
    
    
    async def forgot_password(
        self,
        request
    ):

        try:

            result = await self.user_service.forgot_password(
                request.phone
            )

            if not result["success"]:
                raise HTTPException(
                    status_code=404,
                    detail=result["message"]
                )

            return result

        except HTTPException:
            raise

        except Exception as e:
            raise HTTPException(
                status_code=500,
                detail=str(e)
            )

    # async def verify_forgot_otp(
    #     self,
    #     request
    # ):

    #     try:

    #         result = await self.user_service.verify_forgot_otp(
    #             request.phone,
    #             request.otpCode
    #         )

    #         if not result["success"]:
    #             raise HTTPException(
    #                 status_code=400,
    #                 detail=result["message"]
    #             )

    #         return result

    #     except HTTPException:
    #         raise

    #     except Exception as e:
    #         raise HTTPException(
    #             status_code=500,
    #             detail=str(e)
    #         )

    async def reset_password(
        self,
        request
    ):

        try:

            result = await self.user_service.reset_password(
                request.phone,
                request.otpCode,
                request.newPassword
            )

            if not result["success"]:
                raise HTTPException(
                    status_code=400,
                    detail=result["message"]
                )

            return result

        except HTTPException:
            raise

        except Exception as e:
            raise HTTPException(
                status_code=500,
                detail=str(e)
            )



