"""
Database connection and configuration for MongoDB
"""
import logging
from mongoengine import connect, disconnect
from app.config.settings import get_settings

logger = logging.getLogger(__name__)


class DatabaseManager:
    """MongoDB database connection manager"""
    
    def __init__(self):
        self.settings = get_settings()
        self._connection = None
    
    async def connect_to_database(self):
        """Connect to MongoDB database"""
        try:
            if self._connection is None:
                self._connection = connect(
                    db=self.settings.MONGODB_DATABASE,
                    host=self.settings.MONGODB_HOST,
                    port=self.settings.MONGODB_PORT,
                    username=self.settings.MONGODB_USERNAME,
                    password=self.settings.MONGODB_PASSWORD,
                    authentication_source=self.settings.MONGODB_AUTH_SOURCE,
                    serverSelectionTimeoutMS=self.settings.MONGODB_TIMEOUT * 1000,
                    connectTimeoutMS=self.settings.MONGODB_TIMEOUT * 1000,
                    socketTimeoutMS=self.settings.MONGODB_TIMEOUT * 1000,
                    maxPoolSize=self.settings.MONGODB_MAX_POOL_SIZE,
                    minPoolSize=self.settings.MONGODB_MIN_POOL_SIZE,
                    alias='default'
                )
                logger.info(f"Connected to MongoDB: {self.settings.MONGODB_HOST}:{self.settings.MONGODB_PORT}/{self.settings.MONGODB_DATABASE}")
        except Exception as e:
            logger.error(f"Failed to connect to MongoDB: {e}")
            raise
    
    async def disconnect_from_database(self):
        """Disconnect from MongoDB database"""
        try:
            if self._connection is not None:
                disconnect(alias='default')
                self._connection = None
                logger.info("Disconnected from MongoDB")
        except Exception as e:
            logger.error(f"Error disconnecting from MongoDB: {e}")
    
    def get_connection_status(self) -> bool:
        """Check if database is connected"""
        return self._connection is not None


# Global database manager instance
db_manager = DatabaseManager()


async def connect_to_mongo():
    """Connect to MongoDB"""
    await db_manager.connect_to_database()


async def close_mongo_connection():
    """Close MongoDB connection"""
    await db_manager.disconnect_from_database()


def get_db_manager() -> DatabaseManager:
    """Get database manager instance"""
    return db_manager