import mysql.connector

from utils.config import Config

class Connections:
    def __init__(self, section: str) -> None:
        self.section = section
        self.conn = None
        self.cursor = None

    def __enter__(self) -> tuple[mysql.connector.connection.MySQLConnection, mysql.connector.cursor.MySQLCursor]:
        """Estabelece a conexão e retorna o cursor do banco de dados.

        Raises:
            ValueError: Seção inválida.
            Exception: Se ocorrer um erro ao conectar ao banco de dados.

        Returns:
            mysql.connector.cursor.MySQLCursor: Cursor do banco de dados.
            mysql.connector.connection.MySQLConnection: Conexão do banco de dados.
        """
        config = Config().config(self.section)
        try:
            if self.section in ['dataLake']:
                self.conn = mysql.connector.connect(
                    host=config['host'],
                    user=config['user'],
                    password=config['password'],
                    database=config['database'],
                    port=config['port'],
                    auth_plugin='mysql_native_password',
                    charset='utf8'
                )
                self.cursor = self.conn.cursor(dictionary=True)
            else:
                raise ValueError(f'Seção não suportada: {self.section}')
        except Exception as e:
            raise Exception(f'Erro ao conectar ao banco de dados {self.section}: {str(e)}')
        return self.conn, self.cursor

    def __exit__(self, exc_type, exc_val, exc_tb) -> bool:
        """Fecha o cursor e a conexão com o banco de dados.

        Args:
            exc_type (type): Tipo de exceção levantada.
            exc_val (Exception): Valor da exceção levantada.
            exc_tb (traceback): Rastreamento da pilha da exceção.
        """
        if self.cursor:
            self.cursor.close()
        if self.conn:
            self.conn.close()
        if self.cursor:
            try:
                self.cursor.close()
            except Exception:
                pass
        if self.conn:
            try:
                self.conn.close()
            except Exception:
                pass
        if exc_type is not None:
            print(f"Erro ocorrido: {exc_val}")
            print(f"Rastreamento da pilha: {exc_tb}")
        return False
