import pymysql
from mysql.connector import pooling
from flask import request

from config import DATABASES, DATABASES_LOC

pymysql.install_as_MySQLdb()


class Database:
    _instance = None

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

    def __init__(self) -> None:
        try:
            if not hasattr(self, 'pool'):
                if request.json['vendor'] != 'jify':
                    self._pool = pooling.MySQLConnectionPool(pool_name='emi_checkout_pool', pool_size=5,
                                                             host=DATABASES["default"]["HOST"],
                                                             database=DATABASES["default"]["NAME"],
                                                             user=DATABASES["default"]["USER"],
                                                             password=DATABASES["default"]["PASSWORD"])
                else:
                    self._pool = pooling.MySQLConnectionPool(pool_name='jify_pool', pool_size=5,
                                                             host=DATABASES_LOC["default"]["HOST"],
                                                             database=DATABASES_LOC["default"]["NAME"],
                                                             user=DATABASES_LOC["default"]["USER"],
                                                             password=DATABASES_LOC["default"]["PASSWORD"])
        except Exception as ex:
            raise ex

    def __enter__(self):
        self._connection = self._pool.get_connection()
        self._cursor = self._connection.cursor()
        return self._cursor

    def __exit__(self, exc_type, exc_val, exc_tb):
        if exc_type is not None:
            self._connection.rollback()
        else:
            self._connection.commit()
        self._cursor.close()
        self._connection.close()



