# from bson import ObjectId
# from datetime import datetime

# from app.config.DB import db_manager
# from app.modules.user_subscription.user_subscription_model import (
#     UserSubscriptionModel
# )


# class UserSubscriptionRepository:

#     def __init__(self):
#         self.collection_name = "userSubscriptions"

#     def get_collection(self):
#         return db_manager.db[self.collection_name]

#     async def create_subscription(
#         self,
#         subscription: UserSubscriptionModel
#     ):

#         collection = self.get_collection()

#         data = subscription.model_dump()

#         result = await collection.insert_one(data)

#         data["_id"] = str(result.inserted_id)

#         return data

#     async def get_active_subscription(
#         self,
#         user_id: str
#     ):

#         collection = self.get_collection()

#         subscription = await collection.find_one(
#             {
#                 "user_id": user_id,
#                 "status": "ACTIVE"
#             }
#         )

#         if subscription:
#             subscription["_id"] = str(subscription["_id"])

#         return subscription

#     async def get_subscription_by_id(
#         self,
#         subscription_id: str
#     ):

#         collection = self.get_collection()

#         subscription = await collection.find_one(
#             {
#                 "_id": ObjectId(subscription_id)
#             }
#         )

#         if subscription:
#             subscription["_id"] = str(subscription["_id"])

#         return subscription

#     async def expire_subscription(
#         self,
#         subscription_id: str
#     ):

#         collection = self.get_collection()

#         return await collection.update_one(
#             {
#                 "_id": ObjectId(subscription_id)
#             },
#             {
#                 "$set": {
#                     "status": "EXPIRED",
#                     "updated_at": datetime.utcnow()
#                 }
#             }
#         )

#     async def deactivate_all_subscriptions(
#         self,
#         user_id: str
#     ):

#         collection = self.get_collection()

#         return await collection.update_many(
#             {
#                 "user_id": user_id,
#                 "status": "ACTIVE"
#             },
#             {
#                 "$set": {
#                     "status": "EXPIRED",
#                     "updated_at": datetime.utcnow()
#                 }
#             }
#         )
        
#     async def get_valid_subscription(
#          self,
#          user_id: str
#     ):
#         print("Searching User :", user_id)
#         collection = self.get_collection()
        
#         subscription = await collection.find_one(
#             {
#                 "user_id": user_id,
#                 "status": "ACTIVE",
#                 "end_date":{
#                     "$gt": datetime.utcnow()
#                 }
#             }
#         )
#         print("Subscription :", subscription)
#         if subscription:
#             subscription["_id"] = str(subscription["_id"])
            
#         return subscription
   
   
   
from bson import ObjectId
from datetime import datetime

from app.config.DB import db_manager
from app.modules.user_subscription.user_subscription_model import (
    UserSubscriptionModel
)


class UserSubscriptionRepository:

    def __init__(self):

        self.collection_name = "userSubscriptions"

    def get_collection(self):

        return db_manager.db[self.collection_name]

    async def create_subscription(

        self,

        subscription: UserSubscriptionModel

    ):

        collection = self.get_collection()

        data = subscription.model_dump()

        result = await collection.insert_one(data)

        data["_id"] = str(result.inserted_id)

        return data

    async def get_active_subscription(

        self,

        user_id: str

    ):

        collection = self.get_collection()

        subscription = await collection.find_one(

            {

                "user_id": user_id,

                "status": "ACTIVE"

            }

        )

        if subscription:

            subscription["_id"] = str(subscription["_id"])

        return subscription

    async def get_valid_subscription(

        self,

        user_id: str

    ):

        collection = self.get_collection()

        subscription = await collection.find_one(

            {

                "user_id": user_id,

                "status": "ACTIVE",

                "end_date": {

                    "$gt": datetime.utcnow()

                }

            }

        )

        if subscription:

            subscription["_id"] = str(subscription["_id"])

        return subscription

    async def expire_subscription(

        self,

        subscription_id: str

    ):

        collection = self.get_collection()

        return await collection.update_one(

            {

                "_id": ObjectId(subscription_id)

            },

            {

                "$set": {

                    "status": "EXPIRED",

                    "updated_at": datetime.utcnow()

                }

            }

        )