"""
Agency Signals

This module contains Django signal handlers for the agencies app,
including post-migration signals to create default data.

Author: Development Team
Version: 1.0.0
"""

import logging
from django.db.models.signals import post_migrate
from django.dispatch import receiver
from django.conf import settings

logger = logging.getLogger(__name__)


@receiver(post_migrate, sender='agencies')
def create_default_agency_types(sender, **kwargs):
    """
    Create default AgencyType instances after migrations are run.
    
    This signal handler is triggered after all migrations for the agencies app
    have been applied. It ensures that the default agency types are available
    in the system for users to select when creating agencies.
    
    The signal will only create agency types if they don't already exist,
    making it safe to run multiple times.
    
    Args:
        sender: The sender of the signal (agencies app)
        **kwargs: Additional signal arguments
        
    Signal Information:
        - Signal: post_migrate
        - Sender: agencies app
        - When: After all migrations are applied for agencies app
    """
    try:
        # Import here to avoid circular imports
        from apps.agencies.models import AgencyType
        
        # Check if we need to create default types
        existing_count = AgencyType.objects.count()
        
        logger.info(f"Post-migration signal triggered for agencies app. Current AgencyType count: {existing_count}")
        
        # Only create default types if none exist
        if existing_count == 0:
            logger.info("No existing AgencyType instances found. Creating default agency types...")
            
            # Use the model's built-in method to create default types
            created_types = AgencyType.create_default_types()
            
            if created_types:
                logger.info(f"Successfully created {len(created_types)} default agency types:")
                for agency_type in created_types:
                    logger.info(f"  - {agency_type.name} (Premium: {agency_type.is_premium})")
            else:
                logger.info("No new agency types were created (they may already exist)")
                
        else:
            logger.info(f"AgencyType instances already exist ({existing_count} found). Skipping default type creation.")
            
    except Exception as e:
        logger.error(f"Error creating default agency types: {str(e)}")
        # Don't raise the exception as it could break migrations
        # Log the error and continue
        if settings.DEBUG:
            import traceback
            logger.error(f"Full traceback: {traceback.format_exc()}")


@receiver(post_migrate)
def log_migration_completion(sender, **kwargs):
    """
    Log when migrations are completed for any app.
    
    This is a general signal handler that logs migration completion.
    It's useful for debugging and monitoring migration status.
    
    Args:
        sender: The app that completed migrations
        **kwargs: Additional signal arguments
    """
    if hasattr(sender, 'name') and sender.name == 'apps.agencies':
        app_label = getattr(sender, 'label', sender.name)
        logger.info(f"Migrations completed for app: {app_label}")



# Alternative implementation using the specific app config
@receiver(post_migrate)
def create_agency_defaults_alternative(sender, **kwargs):
    """
    Alternative signal handler that checks for specific app.
    
    This is a backup method that ensures default agency types are created
    even if the sender filtering doesn't work as expected.
    
    Args:
        sender: The sender of the signal 
        **kwargs: Additional signal arguments
    """
    # Only proceed if this is the agencies app
    app_label = getattr(sender, 'label', None)
    if app_label != 'agencies':
        return
        
    try:
        from apps.agencies.models import AgencyType
        
        # Double-check that we need to create defaults
        if AgencyType.objects.exists():
            return
            
        logger.info("Alternative signal: Creating default agency types...")
        AgencyType.create_default_types()
        logger.info("Alternative signal: Default agency types created successfully")
        
    except Exception as e:
        logger.error(f"Alternative signal error: {str(e)}")


# Signal to ensure AgencyType data integrity
@receiver(post_migrate, sender='agencies')
def validate_agency_type_data(sender, **kwargs):
    """
    Validate and fix any AgencyType data integrity issues.
    
    This signal ensures that:
    1. All agency types have valid color codes
    2. Sort orders are properly set
    3. No duplicate names exist
    
    Args:
        sender: The sender of the signal (agencies app)
        **kwargs: Additional signal arguments
    """
    try:
        from apps.agencies.models import AgencyType
        
        # Get all agency types
        agency_types = AgencyType.objects.all()
        
        if not agency_types.exists():
            return
            
        logger.info(f"Validating {agency_types.count()} AgencyType instances...")
        
        updated_count = 0
        
        for agency_type in agency_types:
            needs_update = False
            
            # Validate color code format
            if not agency_type.color_code or not agency_type.color_code.startswith('#'):
                agency_type.color_code = '#007BFF'  # Default blue
                needs_update = True
                
            # Ensure sort order is set
            if agency_type.sort_order is None:
                agency_type.sort_order = 0
                needs_update = True
                
            if needs_update:
                agency_type.save()
                updated_count += 1
                
        if updated_count > 0:
            logger.info(f"Updated {updated_count} AgencyType instances for data integrity")
        else:
            logger.info("All AgencyType instances are valid")
            
    except Exception as e:
        logger.error(f"Error validating AgencyType data: {str(e)}")


# Optional: Signal to create sample data in development
if settings.DEBUG:
    @receiver(post_migrate, sender='agencies')
    def create_sample_agency_data(sender, **kwargs):
        """
        Create sample agency data for development environments.
        
        This signal only runs in DEBUG mode and creates sample agencies
        for testing and development purposes.
        
        Args:
            sender: The sender of the signal (agencies app)
            **kwargs: Additional signal arguments
        """
        try:
            from apps.agencies.models import Agency, AgencyType
            from django.contrib.auth import get_user_model
            
            User = get_user_model()
            
            # Only create if no agencies exist
            if Agency.objects.exists():
                return
                
            # Only create if we have users and agency types
            if not User.objects.exists() or not AgencyType.objects.exists():
                return
                
            logger.info("DEBUG MODE: Creating sample agency data...")
            
            # Get first user as owner
            user = User.objects.first()
            agency_type = AgencyType.objects.first()
            
            # Create sample agency
            sample_agency = Agency.objects.create(
                name="Sample Creative Agency",
                email="contact@sampleagency.com",
                agency_type=agency_type,
                owner=user,
                description="A sample creative agency for testing and development purposes.",
                phone="+1-555-123-4567",
                website="https://sampleagency.com",
                founded_year=2020,
                agency_size="small",
                employee_count=25,
                is_active=True,
                is_verified=True
            )
            
            logger.info(f"Created sample agency: {sample_agency.name}")
            
        except Exception as e:
            logger.error(f"Error creating sample agency data: {str(e)}")
