from mysql.connector import pooling
import os
import traceback
from logger_module.package_logger import print_log


class Database:
    _instance = None

    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = super().__new__(cls)
        return cls._instance

    def __init__(self, commit) -> None:
        try:
            self.commit = commit
            self._connection = None
            if not hasattr(self, '_pool'):
                self._pool = pooling.MySQLConnectionPool(pool_name='api_wrapper_pool', pool_size=5,
                                                         host=os.getenv('MYSQL_HOST'),
                                                         database=os.getenv('MYSQL_DB'),
                                                         port=os.getenv('MYSQL_PORT'),
                                                         user=os.getenv('MYSQL_USER'),
                                                         password=os.getenv('MYSQL_PASSWORD'))
                self.monitor_pool_metrics("Initialized connection pool")
        except Exception as ex:
            traceback.print_exc()

    def __enter__(self):
        if self._connection is None or self._connection._cnx is None:
            self._connection = self._pool.get_connection()
            # self.monitor_pool_metrics("Connection acquired")
        self._cursor = self._connection.cursor(dictionary=True)
        return self._cursor

    def __exit__(self, exc_type, exc_val, exc_tb):
        if exc_type is not None:
            self._connection.rollback()
            self._connection.close()
            # self.monitor_pool_metrics("Connection released")
        elif not self.commit:
            return self._cursor
        else:
            self._connection.commit()
            self._cursor.close()
            self._connection.close()
            # self.monitor_pool_metrics("Connection released")

    def monitor_pool_metrics(self,message):
        try:
            return
        except Exception as ex:
            print_log("Error logging pool status")