from flask_login import UserMixin
from app import Config
import datetime
from bson import ObjectId
import jwt
from decouple import config


users_collection =  Config.db['users']


 
class User(UserMixin):
    def __init__(self, username, email, password, is_verified):
        self.id = None
        self.username = username
        self.email = email
        self.password = password
        self.is_verified = is_verified

        # # Add More Attributes
        self.is_admin      = False
        self.last_login_at = None  # Initialize with None
        self.updated_at    = None  # Initialize with None
        self.created_at    = datetime.datetime.now() 
        
    def is_active(self):
        # Implement the logic to determine whether the user is active or not.
        # Return True for active users and False for inactive users.
        return self.is_verified  

    @staticmethod
    def get(id):
        return users_collection.find_one({"id": id})
    
    # @property
    # def get_id(self):
    #     user = users_collection.find_one({"email":self.email})
    #     return user['id']
    
    @staticmethod
    def get_by_email(email):
        return users_collection.find_one({"email": email})
    

    @staticmethod
    def update(id, data):
        users_collection.update_one({"id": id}, {"$set": data})

    @staticmethod
    def marshal(user):
        return {
            "id": str(user["_id"]), 
            "username": user["username"], 
            "email": user["email"], 
            "is_verified": user["is_verified"]
        } 
    
    def save(self):
        # save all user attribute in users_collection 
        attributes = vars(self)
        user_saved = users_collection.insert_one(attributes)
        user = users_collection.find_one({"email":attributes['email']})
        if user:
            self.id = str(user['_id'])
        return user_saved

    def is_authenticated(self):
        return True  # Return True if the user is authenticated (e.g., via a password check).


    def encode_auth_token(self, email):
        """
        Generates the Auth Token
        :return: string
        """
        try:
            payload = {
                'exp': datetime.datetime.utcnow() + datetime.timedelta(days=0, seconds=5),
                'iat': datetime.datetime.utcnow(),
                'sub': email
            }
            return jwt.encode(
                payload,
                config('SECRET_KEY'),
                algorithm='HS256'
            )
        except Exception as e:
            return e
        
    def all(self):
        users = [user for user in users_collection.find()]
        return users