from flask import current_app
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
import os
from src.models.models import Base

database_name = os.environ.get('DATABASE_NAME')
database_password = os.environ.get('DATABASE_PASSWORD')
database_author = os.environ.get('DATABASE_AUTHOR')

Base.metadata.create_all(
   create_engine(
      'sqlite:///test.db'
  )
)


class DatabaseContextManager:
    def __init__(self):
        self.databasefilename: str = 'sqlite:///test.db' if current_app.config['ENVIRONMENT'] == 'testing' else 'sqlite:///test.db'# f'mysql+pymysql://{database_author}:{database_password}@localhost/{database_name}'
        # Add SQLite-specific connection arguments for better concurrent access
        self.engine = create_engine(
            self.databasefilename,
            connect_args={
                'timeout': 30,  # 30 second timeout
                'check_same_thread': False,  # Allow multi-threading
            },
            pool_pre_ping=True,  # Verify connections before use
            pool_recycle=3600,  # Recycle connections every hour
        )
        self.Session = sessionmaker(bind=self.engine, expire_on_commit=False)

    def __enter__(self):
        self.session = self.Session()
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        if exc_type is not None:
            print(f"DatabaseContextManager exception: {exc_type}")
            self.session.rollback()
        # Always close the session when exiting the context
        self.session.close()

    def commit(self):
        self.session.commit()

    def rollback(self):
        self.session.rollback()
        
    def close(self):
        self.session.close()