
import hashlib

from app.modules.user.user_model import UserModel
from app.modules.user.user_repository import UserRepository


class UserService:

    def __init__(self):
        self.repo = UserRepository()

    def hash_password(
        self,
        password: str
    ) -> str:

        return hashlib.sha256(
            password.encode()
        ).hexdigest()

    async def register_user(
        self,
        phone: str,
        password: str
    ):

        existing_user = await self.repo.find_by_phone(
            phone
        )

        if existing_user:
            return {
                "success": False,
                "message": "User already exists"
            }

        hashed_password = self.hash_password(
            password
        )

        user = UserModel(
            phone=phone,
            password=hashed_password
        )

        created_user = await self.repo.create_user(
            user
        )

        return {
            "success": True,
            "user": created_user
        }

    async def get_user_by_phone(
        self,
        phone: str
    ):

        return await self.repo.find_by_phone(
            phone
        )

    async def login_user(
        self,
        phone: str,
        password: str
    ):

        user = await self.repo.find_by_phone(
            phone
        )

        if not user:
            return {
                "success": False,
                "message": "User not found"
            }

        hashed_password = self.hash_password(
            password
        )

        if user["password"] != hashed_password:
            return {
                "success": False,
                "message": "Invalid password"
            }

        return {
            "success": True,
            "user": user
        }

    async def forgot_password(
        self,
        phone: str
    ):

        user = await self.repo.find_by_phone(
            phone
        )

        if not user:
            return {
                "success": False,
                "message": "User not found"
            }

        # Temporary Hardcoded OTP
        return {
            "success": True,
            "message": "OTP sent successfully",
            "otp": "1234"
        }

    # async def verify_forgot_otp(
    #     self,
    #     phone: str,
    #     otp_code: str
    # ):

    #     user = await self.repo.find_by_phone(
    #         phone
    #     )

    #     if not user:
    #         return {
    #             "success": False,
    #             "message": "User not found"
    #         }

    #     if otp_code != "1234":
    #         return {
    #             "success": False,
    #             "message": "Invalid OTP"
    #         }

    #     return {
    #         "success": True,
    #         "message": "OTP verified successfully"
    #     }

    async def reset_password(
        self,
        phone: str,
        otp_code: str,
        new_password: str
    ):

        user = await self.repo.find_by_phone(
            phone
        )

        if not user:
            return {
                "success": False,
                "message": "User not found"
            }

        if otp_code != "1234":
            return {
                "success": False,
                "message": "Invalid OTP"
            }

        hashed_password = self.hash_password(
            new_password
        )

        await self.repo.update_user(
            user["_id"],
            {
                "password": hashed_password
            }
        )

        return {
            "success": True,
            "message": "Password updated successfully"
        }