"""
Seeder runner for executing database seeders.
"""

import logging
from typing import List, Type
from .base_seeder import BaseSeeder
from src.apps.users.seeders.user_seeder import UserSeeder

logger = logging.getLogger(__name__)


class SeederRunner:
    """
    Runner for executing database seeders.
    
    Automatically discovers and runs seeders from all app modules.
    """
    
    def __init__(self):
        """Initialize the seeder runner with all available seeders."""
        self.seeders: List[Type[BaseSeeder]] = [
            UserSeeder,
            # Add other seeders from different apps here
        ]
    
    def run_all(self) -> None:
        """
        Run all registered seeders.
        """
        logger.info("Starting to run all seeders...")
        
        for seeder_class in self.seeders:
            try:
                seeder = seeder_class()
                seeder.run()
            except Exception as e:
                logger.error(f"Failed to run seeder {seeder_class.__name__}: {e}")
                raise
        
        logger.info("All seeders completed successfully")
    
    def run_seeder(self, seeder_name: str) -> None:
        """
        Run a specific seeder by name.
        
        Args:
            seeder_name: Name of the seeder class to run
        """
        seeder_class = None
        
        for sc in self.seeders:
            if sc.__name__ == seeder_name:
                seeder_class = sc
                break
        
        if not seeder_class:
            available_names = [sc.__name__ for sc in self.seeders]
            raise ValueError(
                f"Seeder '{seeder_name}' not found. "
                f"Available seeders: {', '.join(available_names)}"
            )
        
        logger.info(f"Running specific seeder: {seeder_name}")
        seeder = seeder_class()
        seeder.run()
        logger.info(f"Seeder {seeder_name} completed successfully")


def run_seeders():
    """Convenience function to run all seeders."""
    runner = SeederRunner()
    runner.run_all()


def run_user_seeder():
    """Convenience function to run only the user seeder."""
    runner = SeederRunner()
    runner.run_seeder("UserSeeder")


if __name__ == "__main__":
    # Configure logging for direct execution
    logging.basicConfig(
        level=logging.INFO,
        format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
    )
    
    # Run all seeders
    run_seeders()
