""" Import Important Packages"""
import mysql.connector

from backend.core.ConfigEnv import config


class DBConnection:
    """DBConnection Class. It ensures only one instance of the class is 
       created and it is accessible from everywhere. It is used in the 
       design of logging classes, Configuration classes where we need to have 
       only one instance of the class. There is no need to create multiple 
       instances of each operation across all components of application.

    Raises:
           Exception: It raises an exception if the client instance is not created.
    """
    __client = None #This is the client variable that is used to connect to the database
    _flag = False
    def __init__(self):
        """This is the constructor of the class. It is used to create the client 
        variable. It also checks if the client instance is already created. 
        If the client instance is already created, then it does not create a 
        new client instance.
        """
        # if DBConnection.__client is not None:
        #     raise Exception("This class is a singleton!")
        # else:    
        creds={
            'host':config.HOSTNAME,
            'user':config.UID,
            'password':config.PASSWORD,
            'database':config.DATABASE
        }
        DBConnection.__client = mysql.connector.connect(**creds)
        DBConnection._flag = True

    @staticmethod  # A static method is a method that is called without creating an instance of the class.
    def get_client():
        """The get_client() function is used to get the client instance.

        Returns:
            DBConnection.__client: It returns the client instance.
        """
        return DBConnection.__client

    @classmethod
    def is_connected(cls)->bool:
        """property to get the database connection flag.
        Returns:
            DBConnection._flag: bool. Connection status to the DB.
        """
        return cls._flag